{
int ans=1;
while(b)
{
if(b&1) ans*=a;
a*=a;
b>>=1;
}
return ans;
}
POJ 3070(矩阵快速幂)
#include <iostream>
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "math.h"
using namespace std;
#define N 10000
int a0[2][2]={1,0,0,1},ss[2][2]={1,1,1,0};
void fun(int (*ss)[2],int (*aa)[2])
{
int a,b,c,d;
a=((ss[0][0]*aa[0][0])%N+(ss[0][1]*aa[1][0])%N)%N;
b=((ss[0][0]*aa[0][1])%N+(ss[0][1]*aa[1][1])%N)%N;
c=((ss[1][0]*aa[0][0])%N+(ss[1][1]*aa[1][0])%N)%N;
d=((ss[1][0]*aa[0][1])%N+(ss[1][1]*aa[1][1])%N)%N;
ss[0][0]=a;ss[0][1]=b;ss[1][0]=c;ss[1][1]=d;
}
int B_pow(long long int m)
{
while(m)
{
if(m&1) fun(a0,ss);
fun(ss,ss);
m>>=1;
}
return a0[0][0];
}
int main()
{
long long int m;
while(scanf("%lld",&m)!=EOF&&m!=-1)
{
a0[0][0]=1;a0[0][1]=0;a0[1][0]=1;a0[1][1]=0;
ss[0][0]=1;ss[0][1]=1;ss[1][0]=1;ss[1][1]=0;
if(m==0) printf("0\n");
else printf("%d\n",B_pow(m-1));
}
return 0;
}