原题: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;
}
}