思路:二分幂
#include<stdio.h>
void fun(int a1[][2],int a2[][2])
{
int c[2][2],i,j,k;
for(i=0;i<2;i++)
for(j=0;j<2;j++)
{
c[i][j]=0;
for(k=0;k<2;k++)
c[i][j]=(c[i][j]+a1[i][k]*a2[k][j])%10000;
}
for(i=0;i<2;i++)
for(j=0;j<2;j++)
a1[i][j]=c[i][j];
}
int main()
{
int n;
while(~scanf("%d",&n))
{
int a[2][2]={{1,1},{1,0}};
int b[2][2]={{1,0},{0,1}}; //初始化为单位矩阵,保存fib的值
if(n==-1) break;
while(n)
{
if(n&1)
fun(b,a);
fun(a,a);
n>>=1;
}
printf("%d\n",b[1][0]); //最后n必然从1变为0,所以最后一次总要执行 fun(b, a);
}
}