POJ 3070 矩阵快速幂
裸题,最简单fib的应用模板,算是新技能get 吧。
其实和快速幂差不多了,只是矩阵代替的递推式。
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 const int maxn = 1005; 6 struct node 7 { 8 int a[2][2]; 9 void init() 10 { 11 a[0][0] = a[1][0] = a[0][1] = 1; 12 a[1][1] = 0; 13 } 14 }; 15 node mul(node a,node b) 16 { 17 node c; 18 for(int i = 0;i<2;++i)for(int j = 0;j<2;++j) 19 { 20 c.a[i][j] = 0; 21 for(int k = 0;k<2;++k)c.a[i][j] = (c.a[i][j]+a.a[i][k]*b.a[k][j])%10000; 22 } 23 return c; 24 } 25 node solve(int n) 26 { 27 node s,ret; 28 s.init();ret.init(); 29 while(n) 30 { 31 if(n&1)ret = mul(ret,s); 32 s = mul(s,s); 33 n/=2; 34 } 35 return ret; 36 } 37 int main() 38 { 39 int n; 40 while(~scanf("%d",&n) && n!=-1) 41 { 42 if(!n){printf("0\n");continue;} 43 node ans = solve(n-1); 44 printf("%d\n",ans.a[1][0]%10000); 45 } 46 return 0; 47 }
弱者究竟为何而战?!