模板题->调用模板-> 修改->编译错误->改头文件->AC
(自己根据递推式构造出矩阵)
体会到了模板的好处
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=110; const int MOD=1e4; #define mod(x) ((x)%MOD) int n; struct mat { int m[maxn][maxn]; }unit; mat operator * (mat a,mat b) { mat ret; ll x; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { x=0; for(int k=0;k<n;k++) x+=mod((ll)a.m[i][k]*b.m[k][j]); ret.m[i][j]=mod(x); } } return ret; } void init_unit() { for(int i=0;i<maxn;i++) unit.m[i][i]=1; return; } mat pow_mat(mat a,ll n) { mat ret=unit; while(n) { if(n&1) ret=ret*a; a=a*a; n>>=1; } return ret; } int main() { ll x; init_unit(); while(cin>>x&&x!=-1) { mat a; n=2; a.m[0][0]=1; a.m[0][1]=1; a.m[1][0]=1; a.m[1][1]=0; if(x!=0) a=pow_mat(a,x-1); mat b; b.m[0][0]=1; b.m[1][0]=0; mat c; for(int i=0;i<2;i++){ for(int j=0;j<1;j++){ ll x=0; for(int k=0;k<2;k++) x+=mod((ll)a.m[i][k]*b.m[k][j]); c.m[i][j]=mod(x); } } if(x!=0) cout<<c.m[0][0]<<endl; else cout<<0<<endl; } return 0; }