Pabon_SEC

Yet another Number Sequence

Sep 27th, 2016
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.60 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. struct matrix
  6. {
  7.     long long v[5][5];
  8.  
  9.     long long row,col;
  10.  
  11. } ans,mat;
  12.  
  13. long long mod;
  14.  
  15. matrix multiply(matrix a, matrix b)
  16. {
  17.     matrix r;
  18.  
  19.     for(int i=0; i<2; i++)
  20.     {
  21.         for(int j=0; j<2; j++)
  22.         {
  23.             long long sum = 0;
  24.  
  25.             r.v[i][j] = 0;
  26.  
  27.             for(int k=0; k<2; k++)
  28.             {
  29.                 sum+=a.v[i][k]*b.v[k][j];
  30.  
  31.                 sum%=mod;
  32.             }
  33.  
  34.             r.v[i][j] = sum;
  35.         }
  36.     }
  37.  
  38.     return r;
  39. }
  40.  
  41. matrix power(long long p)
  42. {
  43.     if(p==1)
  44.     {
  45.         return mat;
  46.     }
  47.  
  48.     if(p%2==1)
  49.     {
  50.         return multiply(mat,power(p-1));
  51.     }
  52.  
  53.     matrix ret = power(p/2);
  54.  
  55.     ret = multiply(ret,ret);
  56.  
  57.     return ret;
  58. }
  59.  
  60. int main()
  61. {
  62.     long long tc,a,b,n,m,i,j;
  63.  
  64.     scanf("%lld",&tc);
  65.  
  66.     while(tc--)
  67.     {
  68.         scanf("%lld%lld%lld%lld",&a,&b,&n,&m);
  69.  
  70.         mat.row = mat.col = 2;
  71.  
  72.         for(i = 0; i < 2; ++i)
  73.         {
  74.             for(j = 0; j < 2; ++j)
  75.             {
  76.                 mat.v[i][j] = 1;
  77.             }
  78.         }
  79.  
  80.         mat.v[1][1] = 0;
  81.  
  82.         mod = 1;
  83.  
  84.         for(i=0; i<m; i++)
  85.         {
  86.             mod*=10;
  87.         }
  88.  
  89.         if(n<3)
  90.         {
  91.             if(n==0) printf("%lld\n",a);
  92.  
  93.             else if(n==1) printf("%lld\n",b);
  94.  
  95.             else if(n==2) printf("%lld\n",(a+b)%mod);
  96.         }
  97.         else
  98.         {
  99.             ans = power(n - 1);
  100.  
  101.             int res = b*ans.v[0][0] + a*ans.v[1][0];
  102.  
  103.             printf("%d\n",res%mod);
  104.         }
  105.     }
  106.  
  107.     return 0;
  108. }
Advertisement
Add Comment
Please, Sign In to add comment