poj 3070
题面
大意就是求斐波那契数列第n项,做法为矩阵快速幂。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#define LL long long
using 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;
}