Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define ff first
- #define ss second
- #define int long long
- #define pb push_back
- #define mp make_pair
- #define pii pair<int,int>
- #define vi vector<int>
- #define mii map<int,int>
- #define pqb priority_queue<int>
- #define pqs priority_queue<int,vi,greater<int> >
- #define setbits(x) __builtin_popcountll(x)
- #define zrobits(x) __builtin_ctzll(x)
- #define mod 1000000007
- #define inf 1e18
- #define ps(x,y) fixed<<setprecision(y)<<x
- #define mk(arr,n,type) type *arr=new type[n];
- #define w(x) int x; cin>>x; while(x--)
- #define endl '\n'
- #define all(x) x.begin(), x.end()
- #define deb(x) cout << #x << " " << x << endl;
- #define f(i, n) for(i=0; i<n; i++)
- #define F(i, k, n) for(i=k; i<n; i++)
- // #define max(a,b) (a<b?b:a)
- // #define min(a,b) (a>b?b:a)
- #define PI 3.1415926535897932384626
- #define sz(a) int((a).size())
- #define tr(container, it) \
- for(typeof(container.begin()) it = container.begin(); it != container.end(); it++)
- void FAST() {
- ios::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- }
- template<typename T>
- T gcd(T a, T b) {
- if (b == 0)
- return a;
- return gcd(b, a % b);
- }
- template <typename T>
- void printContainer(T &v){
- for(auto i : v){
- cout<<i<<" ";
- }
- cout <<endl;
- }
- // int fastExpo(int base,int exp){
- // if (exp == 0){
- // return 1;
- // }
- // if (exp == 1){
- // return base;
- // }
- // ll oneHalf = fastExpo(base,exp/2);
- // return oneHalf * oneHalf * fastExpo(base,exp%2);
- // }
- int POW(int n, int p){
- int a = n;
- int ans = 1;
- while(p>0){
- if(p&1){
- ans*=a;
- }
- a = a*a;
- p = p>>1;
- }
- return ans;
- }
- template<typename T>
- T NcR(T n, T r){
- T p = 1, k = 1;
- if (n - r < r)
- r = n - r;
- if (r != 0) {
- while (r) {
- p *= n;
- k *= r;
- T m = gcd(p, k);
- p /= m;
- k /= m;
- n--;
- r--;
- }
- }
- else
- p = 1;
- return p;
- }
- // Start of matrix exponantiation
- // matMult of square matrix
- int p;
- vector<vi > matMult(vector<vi > &A, vector<vi > &B, int size){
- int i, j, k;
- vector<vi > C(size, vi(size));
- f(i,size){
- f(j,size){
- f(k,size){
- // C[i][j] += A[i][k]*B[k][j];
- C[i][j] = (C[i][j]+(A[i][k]*B[k][j])%p)%p;
- }
- }
- }
- return C;
- }
- vector<vi > matPow(vector<vi > &t, int n, int size){
- if(n == 1) return t;
- if(n%2== 1){
- vector<vi > x = matPow(t,n-1,size);
- return matMult(t, x, size);
- }
- vector<vi > x = matPow(t,n/2,size);
- return matMult(x,x, size);
- }
- int recCompute(int k, vi &b, vi &c, int n){
- if(n<k){
- return b[n];
- }
- //creating transformation matrix
- vector<vi > T(k+1, vi(k+1));
- int i,j;
- f(i,k+1){
- f(j,k+1){
- if(i != k && i !=0){
- if(i+1 == j) T[i][j] = 1;
- else T[i][j] = 0;
- }else{
- if(i == 0 && j == 0){
- T[i][j] = 1;
- }else if(i==k && j == 0){
- T[i][j] = 0;
- }else
- T[i][j] = c[k-j];
- }
- }
- }
- vector<vi > M = matPow(T, n-k,k+1);
- int ans = 0;
- f(i,k+1){
- if(i == 0){
- ans = (ans+M[0][i]*accumulate(all(b), 0)%p)%p; // since first element is sum here
- }else
- ans = (ans + M[0][i]*b[i-1]%p)%p;
- }
- return ans;
- }
- // *********** END OF TEMPELATE *********************
- int32_t main() {
- // freopen("input.txt", "r", stdin);
- // freopen("output.txt", "w", stdout);
- FAST();
- w(t){
- int k;
- cin>>k;
- vi b(k);
- vi c(k);
- int i;
- f(i,k) cin>>b[i];
- f(i,k) cin>>c[i];
- int m,n;
- int ans = 0;
- cin>>m>>n>>p;
- int t1 ;
- if(m<=k){
- t1 = accumulate(b.begin(), b.begin()+m-1,0);
- }else{
- t1 = recCompute(k, b,c,m-1);
- }
- int t2;
- if(n<=k){
- t2 = accumulate(b.begin(), b.begin()+n,0);
- }else{
- t2 = recCompute(k, b,c,n);
- }
- ans = ((t2-t1)%p+p)%p;
- cout<<ans<<endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement