首页 > 代码库 > poj 3070 Fibonacci
poj 3070 Fibonacci
http://poj.org/problem?id=3070
矩阵的快速幂,二分
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define maxn 10000 5 using namespace std; 6 const int mod=10000; 7 8 int n; 9 struct node 10 { 11 int a[4][4]; 12 }; 13 14 node multi(node s,node t) 15 { 16 node c; 17 for(int i=0; i<2; i++) 18 { 19 for(int j=0; j<2; j++) 20 { 21 c.a[i][j]=0; 22 for(int k=0; k<2; k++) 23 { 24 c.a[i][j]=(c.a[i][j]+s.a[i][k]*t.a[k][j])%mod; 25 } 26 } 27 } 28 return c; 29 } 30 31 32 int main() 33 { 34 while(scanf("%d",&n)!=EOF) 35 { 36 if(n==-1) break; 37 node m,x; 38 m.a[0][0]=1; m.a[0][1]=0; 39 m.a[1][0]=0; m.a[1][1]=1; 40 x.a[0][0]=x.a[0][1]=x.a[1][0]=1; 41 x.a[1][1]=0;; 42 while(n) 43 { 44 if(n&1) 45 { 46 m=multi(m,x); 47 } 48 x=multi(x,x); 49 n>>=1; 50 } 51 printf("%d\n",m.a[0][1]); 52 } 53 return 0; 54 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。