题面
大意就是求斐波那契数列第n项,做法为矩阵快速幂。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#define LL long longusing namespace std;
const int mod = 10000; struct Mat{LL a[4][4];Mat(){memset(a,0,sizeof(a));}Mat operator*(const Mat &h){Mat c;for(register int i=1;i<=2;i++)for(register int j=1;j<=2;j++)for(register int k=1;k<=2;k++){c.a[i][j]+=a[i][k]%mod*h.a[k][j]%mod;c.a[i][j]%=mod;}return c;}
}ans,f;int n;inline void fast_pow(Mat b,int k){for(;k;k>>=1){if(k&1) f=f*b;b=b*b;}
}int main(){while(~scanf("%d",&n)){if(n==-1) break;f.a[1][1]=0;f.a[1][2]=1;ans.a[2][1]=ans.a[1][2]=ans.a[2][2]=1;ans.a[1][1]=0;fast_pow(ans,n);printf("%lld\n",f.a[1][1]);}return 0;
}