//此题提供了用矩阵快速幂计算斐波那契的数列的方式
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
struct matrix{
int data[2][2];
};
struct matrix Mul(struct matrix x,struct matrix y)
{
struct matrix temp;
temp.data[0][0]=(x.data[0][0]*y.data[0][0]+x.data[0][1]*y.data[1][0])%10000;
temp.data[0][1]=(x.data[0][0]*y.data[0][1]+x.data[0][1]*y.data[1][1])%10000;
temp.data[1][0]=(x.data[1][0]*y.data[0][0]+x.data[1][1]*y.data[1][0])%10000;
temp.data[1][1]=(x.data[1][0]*y.data[0][1]+x.data[1][1]*y.data[1][1])%10000;
return temp;
}
struct matrix MatrixPow(struct matrix mar,int n){
if(n==1)
return mar;
struct matrix temp;
temp=MatrixPow(mar,n/2);
if(n%2==0)
return Mul(temp,temp);
else
return Mul(Mul(temp,temp),mar);
}
int main(){
int n;
struct matrix mar;
struct matrix result;
mar.data[0][0]=mar.data[0][1]=mar.data[1][0]=1;
mar.data[1][1]=0;
while(cin>>n&&n>=0){
if(n==0){
cout<<0<<'\n';
continue;
}
result=MatrixPow(mar,n);
cout<<result.data[0][1]<<'\n';
}
return 0;
}
POJ 3070 (矩阵快速幂,矩阵快速幂求斐波那契)
最新推荐文章于 2024-08-14 11:57:49 发布