HDU 1757 A Simple Math Problem(矩阵快速幂模板)
Posted 谦谦君子,陌上其华
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 1757 A Simple Math Problem(矩阵快速幂模板)相关的知识,希望对你有一定的参考价值。
题意:
题意很简单,不多说了。
思路:
|f(10) | |a0 a1 a2 ...a8 a9| |f(9)|
| f(9) | | 1 0 0 ... 0 0 | |f(8)|
| ..... | = | .. ... ... ... | | .. |
| f(2) | | 0 0 0 ... 0 0| |f(1)|
| f(1) | | 0 0 0 ... 1 0| |f(0)|
为自己留个模板。
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<sstream> 6 #include<vector> 7 #include<stack> 8 #include<queue> 9 #include<cmath> 10 #include<map> 11 #include<set> 12 using namespace std; 13 typedef long long ll; 14 typedef pair<int,int> pll; 15 const int INF = 0x3f3f3f3f; 16 const int maxn = 1000 + 5; 17 18 int n,m; 19 20 struct Matrix 21 { 22 int mat[12][12]; 23 Matrix operator *(Matrix a) 24 { 25 Matrix c; 26 for(int i=0;i<10;i++) 27 { 28 for(int j=0;j<10;j++) 29 { 30 c.mat[i][j]=0; 31 for(int k=0;k<10;k++) 32 { 33 c.mat[i][j]+=(mat[i][k]*a.mat[k][j])%m; 34 c.mat[i][j]%=m; 35 } 36 } 37 } 38 return c; 39 } 40 }; 41 42 Matrix base, ans; 43 44 void init() 45 { 46 for(int i=0;i<10;i++) 47 for(int j=0;j<10;j++) 48 { 49 if(i==j) ans.mat[i][j]=1; 50 else ans.mat[i][j]=0; 51 if(i-1==j) base.mat[i][j]=1; 52 else base.mat[i][j]=0; 53 } 54 } 55 56 void pow(int n) 57 { 58 while(n) 59 { 60 if(n&1) ans=ans*base; 61 base=base*base; 62 n>>=1; 63 } 64 } 65 66 int main() 67 { 68 //freopen("in.txt","r",stdin); 69 while(~scanf("%d%d",&n,&m)) 70 { 71 init(); 72 for(int i=0;i<10;i++) scanf("%d",&base.mat[0][i]); 73 if(n<10) {printf("%d\n",n%m);continue;} 74 pow(n-9); 75 int sum=0; 76 for(int i=0;i<10;i++) sum=(sum+ans.mat[0][i]*(9-i))%m; 77 printf("%d\n",sum); 78 } 79 return 0; 80 }
以上是关于HDU 1757 A Simple Math Problem(矩阵快速幂模板)的主要内容,如果未能解决你的问题,请参考以下文章
hdu 1757 A Simple Math Problem 矩阵快速幂
hdu-1757 A Simple Math Problem---矩阵快速幂模板题
HDU 1757 A Simple Math Problem(矩阵快速幂模板)