#include<stdio.h>
struct JZ
{
int jz[3][3];
};
JZ mul(JZ a,JZ b)
{
JZ ans;
int i,j,k;
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
ans.jz[i][j]=0;
for(k=0;k<2;k++)
{
ans.jz[i][j]+=(a.jz[i][k]%10000)*(b.jz[k][j]%10000);
}
ans.jz[i][j]=ans.jz[i][j]%10000;
}
}
return ans;
}
JZ pow(JZ c,int d)
{
JZ ans;
ans.jz[0][0]=1;
ans.jz[0][1]=1;
ans.jz[1][0]=1;
ans.jz[1][1]=0;
while(d)
{
if(d%2==1)
{
ans=mul(ans,c);
}
c=mul(c,c);
d=d/2;
}
return ans;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n!=-1)
{
if(n==0)
{
printf("0\n");
continue;
}
JZ m;
m.jz[0][0]=1;
m.jz[0][1]=1;
m.jz[1][0]=1;
m.jz[1][1]=0;
m=pow(m,n-1);
printf("%d\n",m.jz[0][1]%10000);
}
}
POJ3070 - Fibonacci - 矩阵快速幂
最新推荐文章于 2021-09-14 14:51:53 发布