| 
 | 1 | +#include <bits/stdc++.h>  | 
 | 2 | +using namespace std;  | 
 | 3 | +typedef long long ll;  | 
 | 4 | +typedef vector<ll> vi;  | 
 | 5 | +typedef vector<vi> vvi;  | 
 | 6 | +ll mod;// = 1000000007;  | 
 | 7 | +void printMat(vvi& a) {  | 
 | 8 | +	for (int i = 0; i < a.size(); ++i)  | 
 | 9 | +	{	for (int j = 0; j < a[0].size(); ++j)cout << a[i][j] << " ";  | 
 | 10 | +		cout << "\n";  | 
 | 11 | +	}  | 
 | 12 | +}  | 
 | 13 | + | 
 | 14 | +vvi mul(const vvi& a, const vvi& b) {  | 
 | 15 | +	vvi c(a.size(), vi(b[0].size(), 0));  | 
 | 16 | + | 
 | 17 | +	for (int r = 0; r < a.size(); ++r) {  | 
 | 18 | +		for (int j = 0; j < b[0].size(); ++j) {  | 
 | 19 | +			for (int x = 0; x < b.size(); ++x) {  | 
 | 20 | +				c[r][j] += (a[r][x] % mod) * (b[x][j] % mod);  | 
 | 21 | +				c[r][j] %= mod;  | 
 | 22 | +			}  | 
 | 23 | +		}  | 
 | 24 | +	}  | 
 | 25 | +	return c;  | 
 | 26 | +}  | 
 | 27 | + | 
 | 28 | +vvi pow(const vvi& a, int n) {  | 
 | 29 | +	if (n <= 1) return a;  | 
 | 30 | +	if (n & 1) return mul(a, pow(a, n - 1));  | 
 | 31 | + | 
 | 32 | +	vvi ans = pow(a, n / 2);  | 
 | 33 | +	ans = mul(ans, ans);  | 
 | 34 | +	return ans;  | 
 | 35 | +}  | 
 | 36 | + | 
 | 37 | +ll sum(int n, vi& b, vi& c) {  | 
 | 38 | +	if (n < 1) return 0;  | 
 | 39 | + | 
 | 40 | +	int k = b.size();  | 
 | 41 | +	vvi t(k + 1, vi(k + 1, 0));  | 
 | 42 | + | 
 | 43 | +	for (int i = 0; i <= k; ++i) {  | 
 | 44 | +		for (int j = 0; j <= k; ++j) {  | 
 | 45 | +			//for last row  | 
 | 46 | +			if (i != k && j == i + 1) t[i][j] = 1;  | 
 | 47 | +			else if (i == k && j != 0) t[i][j] = c[j-1];  | 
 | 48 | +			// else if (i == 0 && j == 1) t[i][j] = 1;  | 
 | 49 | +		}  | 
 | 50 | +	}  | 
 | 51 | +	t[0][0] = t[0][1] = 1;  | 
 | 52 | + | 
 | 53 | +	vvi tn = pow(t, n);  | 
 | 54 | +	// printMat(tn);  | 
 | 55 | +	ll ans  = 0;  | 
 | 56 | +	//the R0b0 is the answer  | 
 | 57 | +	for (int i = 0; i < k; ++i) {  | 
 | 58 | +		// cout << t[0][1+i] << endl;  | 
 | 59 | +		ans += (tn[0][i + 1] * b[i]) % mod;  | 
 | 60 | +		ans %= mod;  | 
 | 61 | +	}  | 
 | 62 | +	// cout << ans << endl;  | 
 | 63 | +	return ans;  | 
 | 64 | +}  | 
 | 65 | + | 
 | 66 | +int main() {  | 
 | 67 | +	int t;  | 
 | 68 | +	cin >> t;  | 
 | 69 | +	while (t--) {  | 
 | 70 | +		int k; cin >> k;  | 
 | 71 | +		vi b(k);  | 
 | 72 | +		for (int i = 0; i < k; ++i) cin >> b[i];  | 
 | 73 | +		vi c(k);  | 
 | 74 | +		for (int i = 0; i < k; ++i) cin >> c[k - i - 1];  | 
 | 75 | +		ll m, n;  | 
 | 76 | +		cin >> m >> n >> mod;  | 
 | 77 | +		ll m_ = sum(m - 1, b, c);  | 
 | 78 | +		ll n_ = sum(n, b, c);  | 
 | 79 | +		// int ans = (n==1&& m<=1) ? b[0] : (n_ - m_ + mod);  | 
 | 80 | +		ll ans = (n_- m_ + mod) % mod;  | 
 | 81 | +		//ALWAYS handle negative mods  | 
 | 82 | +		cout << ans << "\n";  | 
 | 83 | +	}  | 
 | 84 | +}  | 
0 commit comments