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 }
posted on 2017-03-26 13:36 zAnonymous 阅读(115) 评论(0) 收藏 举报
浙公网安备 33010602011771号