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 }
View Code

 

转载于:https://www.cnblogs.com/fanminghui/p/3764344.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值