#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int mod=10000;
struct Matrix
{
int mtx[2][2];
Matrix(){
memset(mtx,0,sizeof(mtx));
}
};
Matrix multiply(Matrix a,Matrix b){
Matrix c;
for(int i=0;i<2;++i){
for(int j=0;j<2;++j){
for(int k=0;k<2;++k){
c.mtx[i][j]+=a.mtx[i][k]*b.mtx[k][j];
}
c.mtx[i][j]%=mod;
}
}
return c;
}
Matrix quickpow(Matrix a,int n){
Matrix b;
b.mtx[0][0]=b.mtx[1][1]=1;
b.mtx[0][1]=b.mtx[1][0]=0;//E
while(n){
if(n&1) b=multiply(a,b);
a=multiply(a,a);
n/=2;
}
return b;
}
int main()
{
int n;
while(scanf("%d",&n)&&n!=-1){
Matrix a,res;
a.mtx[0][0]=1;a.mtx[0][1]=1;
a.mtx[1][0]=1;a.mtx[1][1]=0;
res=quickpow(a,n);
printf("%d\n",res.mtx[0][1]);
}
return 0;
}
poj3070 Fibonacci(矩阵快速幂,斐波拉契)
最新推荐文章于 2020-03-15 23:18:59 发布