poj3070 Fibonacci
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct T
{
int er[200];
int num;
};//n转换为二进制后的表示用数组存起来
T change(int n)
{
T linshi;
linshi.num=0;
while(n!=0)
{
if(n%2==1)
{
linshi.er[linshi.num]=1;
linshi.num++;
n=(n-1)/2;
}
if(n%2==0)
{
linshi.er[linshi.num]=0;
linshi.num++;
n=n/2;
}
}
return linshi;
}
int poww(int a,int b)
{
int res=1;
int i;
for(i=1;i<=b;i++)
{
res*=a;
}
return res;
}
int p[30][4];//p[i][4]表示原矩阵的2^i次方
void cal(int ret[4],int m[4],int n[4])
{
int i;
int a[4];
int b[4];
for(i=0;i<4;i++)
{
a[i]=m[i];
b[i]=n[i];
}
ret[0]=(a[0]*b[0]+a[1]*b[2])%10000;
ret[1]=(a[0]*b[1]+a[1]*b[3])%10000;
ret[2]=(a[2]*b[0]+a[3]*b[2])%10000;
ret[3]=(a[2]*b[1]+a[3]*b[3])%10000;
}
void init()
{
p[0][0]=1;
p[0][1]=1;
p[0][2]=1;
p[0][3]=0;
int i;
for(i=1;i<30;i++)
{
cal(p[i],p[i-1],p[i-1]);
}
}
int main()
{
init();
int n;
while(scanf("%d",&n),n!=-1)
{
T bin;
bin=change(n);
int res[4]={1,0,0,1};
int i;
for(i=0;i<bin.num;i++)
{
if(bin.er[i]==0)
{
continue;
}
cal(res,res,p[i]);
}
printf("%d\n",res[2]);
}
return 0;
}