裸用矩阵快速幂求斐波拉契
#include <cstdio>
#define MOD 10000
#define lp(i,j,k) for(int i = j;i <= k;++i)
struct MATRIX {
int a[3][3];
MATRIX operator * (const MATRIX &b) {
MATRIX re;
lp(i,1,2)
lp(j,1,2) {
re.a[i][j] = 0;
lp(k,1,2) {
re.a[i][j] += a[i][k] * b.a[k][j];
if(re.a[i][j] >= MOD)
re.a[i][j] %= MOD;
}
}
return re;
}
}m;
int n;
int ksm (MATRIX &n,int k) {
MATRIX re,p = n;
re.a[1][1] = re.a[2][2] = 1;
re.a[1][2] = re.a[2][1] = 0;
while(k) {
if(k & 1) {
re = re * p;
}
p = p * p;
k >>= 1;
}
return re.a[1][1];
}
int main () {
m.a[1][1] = m.a[1][2] = m.a[2][1] = 1;
while(scanf("%d",&n),n != -1) {
if(--n == -1)
puts("0");
else {
printf("%d\n",ksm(m,n));
}
}
}