icpc-沈阳区域赛-C

矩阵快速幂

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 using namespace std;
  5 typedef long long ll;
  6 const int n=7;
  7 const ll mod=2147493647;
  8 typedef struct node
  9 {
 10     ll matr[n][n];
 11 } Matrix;
 12 
 13 Matrix ma,unit;
 14 void init()
 15 {
 16     for(int i=0; i<n; i++)
 17     {
 18         for(int j=0; j<n; j++)
 19         {
 20             if(j==1)
 21             {
 22                 ma.matr[i][j]=1;
 23             }
 24             if(j==2&&i!=0&&i!=1)
 25             {
 26                 ma.matr[i][j]=1;
 27             }
 28         }
 29         if(i!=0)
 30             ma.matr[i][i]=1;
 31     }
 32     ma.matr[1][0]=2;
 33     ma.matr[4][3]=2;
 34     ma.matr[5][3]=3;
 35     ma.matr[6][3]=4;
 36     ma.matr[5][4]=3;
 37     ma.matr[6][4]=6;
 38     ma.matr[6][5]=4;
 39     for(int i=0; i<n; i++)
 40     {
 41         for(int j=0; j<n; j++)
 42             unit.matr[i][j]=0;
 43         unit.matr[i][i]=1;
 44     }
 45 }
 46 Matrix mul(Matrix a,Matrix b)
 47 {
 48     Matrix c;
 49     for(int i=0; i<n; i++)
 50     {
 51         for(int j=0; j<n; j++)
 52         {
 53             c.matr[i][j]=0;
 54             for(int k=0; k<n; k++)
 55             {
 56                 c.matr[i][j]+=(a.matr[i][k]*b.matr[k][j])%mod;
 57             }
 58             c.matr[i][j]%=mod;
 59         }
 60     }
 61     return c;
 62 }
 63 Matrix cal(Matrix a,int n)
 64 {
 65     Matrix b=unit;
 66     while(n>0)
 67     {
 68         if(n%2==1)
 69             b=mul(b,a);
 70         n>>=1;
 71         a=mul(a,a);
 72     }
 73     return b;
 74 }
 75 int main()
 76 {
 77     int t;
 78     ll N,a,b;
 79     init();
 80     scanf("%d",&t);
 81     while(t--)
 82     {
 83         scanf("%lld%lld%lld",&N,&a,&b);
 84         Matrix res;
 85         res.matr[0][0]=a*2;
 86         res.matr[0][1]=b;
 87         res.matr[0][2]=16;
 88         res.matr[0][3]=32;
 89         res.matr[0][4]=24;
 90         res.matr[0][5]=8;
 91         res.matr[0][6]=1;
 92         if(N==1)
 93             printf("%d\n",a);
 94         else if(N==2)
 95             printf("%d\n",b);
 96         else
 97         {
 98             Matrix TAT=cal(ma,N-2);
 99             res=mul(res,TAT);
100             printf("%lld\n",res.matr[0][1]%mod);
101         }
102     }
103     return 0;
104 }
View Code

 

posted on 2017-03-26 13:36  zAnonymous  阅读(115)  评论(0)    收藏  举报

导航