POJ3070 Fibonacci

原题:http://poj.org/problem?id=3070


解体思路:

运用快速幂法;

任何一个数都能用2进制表示,如 15 = 1111;

则 有A^15 = A^8*A^4*A^2*A;

由此便能大大的减少乘法的计算次数


代码:

#include <iostream>


using namespace std;


struct MATRICX{ //矩阵结构体
int a[2][2];
void init(){
a[0][0] = 1;
a[0][1] = 1;
a[1][0] = 1;
a[1][1] = 0;
  }
};


MATRICX MatrixMul(MATRICX a, MATRICX b){ //矩阵乘法运算
MATRICX c;
int i, j, k;
for (i = 0; i < 2; i++)
for (j = 0; j < 2; j++){
c.a[i][j] = 0;
for (k = 0; k < 2; k++)
c.a[i][j] += (a.a[i][k] * b.a[k][j] % 10000);
}
return c;
}


int main()
{
int in;
MATRICX temp,ans;
while (cin >> in && in != -1) {
temp.init();
ans.a[0][0] = ans.a[1][1] = 1;
ans.a[0][1] = ans.a[1][0] = 0;
if (in == 0){
cout << "0" << endl;
continue;
}
in = in - 1;

//快速幂法
while (in){
if (in & 1) //判断该二进制位幂数是否存在
ans = MatrixMul(ans, temp);
temp = MatrixMul(temp, temp); //以二进升高幂数
in = in >> 1;
}
cout << ans.a[0][0] % 10000 << endl;
}


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值