Advertisement
Guest User

Untitled

a guest
Jan 24th, 2021
247
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.12 KB | None | 0 0
  1.     #include <bits/stdc++.h>
  2.  
  3.     using namespace std;
  4.    
  5.     #define ff              first
  6.     #define ss              second
  7.     #define int             long long
  8.     #define pb              push_back
  9.     #define mp              make_pair
  10.     #define pii             pair<int,int>
  11.     #define vi              vector<int>
  12.     #define mii             map<int,int>
  13.     #define pqb             priority_queue<int>
  14.     #define pqs             priority_queue<int,vi,greater<int> >
  15.     #define setbits(x)      __builtin_popcountll(x)
  16.     #define zrobits(x)      __builtin_ctzll(x)
  17.     #define mod             1000000007
  18.     #define inf             1e18
  19.     #define ps(x,y)         fixed<<setprecision(y)<<x
  20.     #define mk(arr,n,type)  type *arr=new type[n];
  21.     #define w(x)            int x; cin>>x; while(x--)
  22.     #define endl            '\n'
  23.     #define all(x)          x.begin(), x.end()
  24.     #define deb(x)          cout << #x << " " << x << endl;
  25.     #define f(i, n)         for(i=0; i<n; i++)
  26.     #define F(i, k, n)      for(i=k; i<n; i++)
  27.     // #define max(a,b)         (a<b?b:a)
  28.     // #define min(a,b)         (a>b?b:a)
  29.     #define PI              3.1415926535897932384626
  30.     #define sz(a)           int((a).size())
  31.    
  32.     #define tr(container, it) \
  33.     for(typeof(container.begin()) it = container.begin(); it != container.end(); it++)
  34.    
  35.     void FAST() {  
  36.         ios::sync_with_stdio(0);
  37.         cin.tie(0);
  38.         cout.tie(0);
  39.     }
  40.    
  41.     template<typename T>
  42.     T gcd(T a, T b) {
  43.         if (b == 0)
  44.             return a;
  45.         return gcd(b, a % b);  
  46.     }
  47.    
  48.     template <typename T>
  49.     void printContainer(T &v){
  50.         for(auto i : v){
  51.             cout<<i<<" ";
  52.         }
  53.         cout <<endl;
  54.     }
  55.    
  56.     // int fastExpo(int base,int exp){
  57.     //     if (exp == 0){
  58.     //         return 1;
  59.     //     }
  60.     //     if (exp == 1){
  61.     //         return base;
  62.     //     }
  63.     //     ll oneHalf = fastExpo(base,exp/2);
  64.     //     return oneHalf * oneHalf * fastExpo(base,exp%2);
  65.     // }
  66.  
  67.     int POW(int n, int p){
  68.         int a = n;
  69.         int ans = 1;
  70.         while(p>0){
  71.             if(p&1){
  72.                 ans*=a;
  73.             }
  74.             a = a*a;
  75.             p = p>>1;
  76.         }
  77.         return ans;
  78.     }
  79.    
  80.     template<typename T>
  81.     T NcR(T n, T r){
  82.    
  83.         T p = 1, k = 1;
  84.         if (n - r < r)
  85.             r = n - r;
  86.    
  87.         if (r != 0) {
  88.             while (r) {
  89.                 p *= n;
  90.                 k *= r;
  91.    
  92.                 T m = gcd(p, k);
  93.    
  94.                 p /= m;
  95.                 k /= m;
  96.    
  97.                 n--;
  98.                 r--;
  99.             }
  100.         }
  101.         else
  102.             p = 1;
  103.         return p;
  104.     }
  105.  
  106.     // Start of matrix exponantiation
  107.     // matMult of square matrix
  108.     int p;
  109.  
  110.     vector<vi > matMult(vector<vi > &A, vector<vi > &B, int size){
  111.         int i, j, k;
  112.         vector<vi > C(size, vi(size));
  113.         f(i,size){
  114.             f(j,size){
  115.                 f(k,size){
  116.                     // C[i][j] += A[i][k]*B[k][j];
  117.                     C[i][j] = (C[i][j]+(A[i][k]*B[k][j])%p)%p;
  118.                 }
  119.             }
  120.         }
  121.  
  122.         return C;
  123.     }
  124.  
  125.     vector<vi > matPow(vector<vi > &t, int n, int size){
  126.         if(n == 1) return t;
  127.         if(n%2== 1){
  128.             vector<vi > x = matPow(t,n-1,size);
  129.             return matMult(t, x, size);
  130.         }
  131.         vector<vi > x = matPow(t,n/2,size);
  132.         return matMult(x,x, size);
  133.     }
  134.  
  135.     int recCompute(int k, vi &b, vi &c, int n){
  136.         if(n<k){
  137.             return b[n];
  138.         }
  139.     //creating transformation matrix
  140.         vector<vi > T(k+1, vi(k+1));
  141.         int i,j;
  142.         f(i,k+1){
  143.             f(j,k+1){
  144.                 if(i != k && i !=0){
  145.                     if(i+1 == j) T[i][j] = 1;
  146.                     else T[i][j] = 0;
  147.                 }else{
  148.                     if(i == 0 && j == 0){
  149.                         T[i][j] = 1;
  150.                        
  151.                     }else if(i==k && j == 0){
  152.                         T[i][j] = 0;
  153.                        
  154.                     }else
  155.                     T[i][j] = c[k-j];
  156.                 }
  157.  
  158.             }
  159.         }
  160.         vector<vi > M = matPow(T, n-k,k+1);
  161.         int ans = 0;
  162.         f(i,k+1){
  163.             if(i == 0){
  164.                 ans = (ans+M[0][i]*accumulate(all(b), 0)%p)%p; // since first element is sum here
  165.             }else
  166.             ans = (ans + M[0][i]*b[i-1]%p)%p;
  167.         }
  168.         return ans;
  169.     }
  170.  
  171.     // *********** END OF TEMPELATE *********************
  172.    
  173.     int32_t main() {
  174.         // freopen("input.txt", "r", stdin);
  175.         // freopen("output.txt", "w", stdout);
  176.         FAST();  
  177.         w(t){
  178.             int k;
  179.             cin>>k;
  180.             vi b(k);
  181.             vi c(k);
  182.             int i;
  183.             f(i,k) cin>>b[i];
  184.             f(i,k) cin>>c[i];
  185.             int m,n;
  186.             int ans = 0;
  187.             cin>>m>>n>>p;
  188.             int t1 ;
  189.             if(m<=k){
  190.                 t1 = accumulate(b.begin(), b.begin()+m-1,0);
  191.             }else{
  192.                 t1 = recCompute(k, b,c,m-1);
  193.             }
  194.             int t2;
  195.             if(n<=k){
  196.                 t2 = accumulate(b.begin(), b.begin()+n,0);
  197.             }else{
  198.                 t2 = recCompute(k, b,c,n);
  199.             }
  200.             ans = ((t2-t1)%p+p)%p;
  201.             cout<<ans<<endl;
  202.         }
  203.         return 0;
  204.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement