hdu6470 Count 矩阵快速幂

hdu6470 Count

 

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn = 6, mod = 123456789;
 5 
 6 struct MAT {
 7     ll a[maxn][maxn];
 8     MAT(){ memset(a,0,sizeof(a)); }
 9     MAT operator*(MAT p) {
10         MAT res;
11         for (int i = 0; i < maxn; i++)
12             for (int j = 0; j < maxn; j++)
13                 for(int k = 0; k < maxn; k++)
14                     res.a[i][j] = (res.a[i][j]+a[i][k]*p.a[k][j])%mod;
15         return res;
16     }
17 };
18 MAT mat_qpow(MAT A, ll b) {
19     MAT res;
20     res.a[0][0] = 1;
21     for (int i = 0; i < maxn; i++) {
22         res.a[i][i] = 1;
23     }
24     while(b) {
25         if(b&1) res = res*A;
26         A = A*A;
27         b >>= 1;
28     }
29     return res;
30 }
31 void init(MAT& A, MAT& B) {
32     A.a[0][0]=1, A.a[0][1]=2, A.a[0][2]=1, A.a[0][3]=0, A.a[0][4]=0, A.a[0][5]=0;
33     A.a[1][0]=1, A.a[1][1]=0, A.a[1][2]=0, A.a[1][3]=0, A.a[1][4]=0, A.a[1][5]=0;
34     A.a[2][0]=0, A.a[2][1]=0, A.a[2][2]=1, A.a[2][3]=3, A.a[2][4]=3, A.a[2][5]=1;
35     A.a[3][0]=0, A.a[3][1]=0, A.a[3][2]=0, A.a[3][3]=1, A.a[3][4]=2, A.a[3][5]=1;
36     A.a[4][0]=0, A.a[4][1]=0, A.a[4][2]=0, A.a[4][3]=0, A.a[4][4]=1, A.a[4][5]=1;
37     A.a[5][0]=0, A.a[5][1]=0, A.a[5][2]=0, A.a[5][3]=0, A.a[5][4]=0, A.a[5][5]=1;
38 
39     B.a[0][0]=2, B.a[1][0]=1, B.a[2][0]=27, B.a[3][0]=9, B.a[4][0]=3, B.a[5][0]=1;
40 }
41 
42 int main() {
43     int t; scanf("%d",&t);
44     while(t--) {
45         ll n; scanf("%lld",&n);
46         MAT A; MAT ans;
47         init(A,ans);
48         ans = mat_qpow(A,n-2)*ans;
49         printf("%lld\n",ans.a[0][0]);
50     }
51     return 0;
52 }

 

posted @ 2019-10-26 14:36  麻辣猪仔  阅读(167)  评论(0)    收藏  举报