POJ3070:Fibonacci——题解
http://poj.org/problem?id=3070
题目大意:求Fibonacci数列第n项,对10000取模。
矩阵乘法板子题……实在不知道写什么了。
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #include<queue> using namespace std; typedef long long ll; ll n,m=10000; struct node{ ll g[4][4]; }f,res; void buildI(node &x){//构造单位矩阵 for(int i=1;i<=2;i++){ for(int j=1;j<=2;j++){ if(i==j)x.g[i][j]=1LL; else x.g[i][j]=0LL; } } return; } void multi(node &x,node &y,node &z){//z=x*y memset(z.g,0,sizeof(z.g)); for(int i=1;i<=2;i++){ for(int j=1;j<=2;j++){ if(x.g[i][j]){ for(int k=1;k<=2;k++){ z.g[i][k]+=x.g[i][j]%m*y.g[j][k]%m; z.g[i][k]%=m; } } } } return; } void qpow(ll k){ buildI(res); node tmp=f,t; while(k!=0){ if(k&1){ multi(res,tmp,t); res=t; } multi(tmp,tmp,t); tmp=t; k>>=1; } return; } ll solve(){ if(n==0)return 0LL; if(n<=2)return 1LL; qpow(n-2); ll ret=res.g[1][1]%m+res.g[2][1]%m; return ret%m; } int main(){ while(scanf("%lld",&n)!=EOF){ if(n==-1)break; f.g[1][1]=1;f.g[1][2]=1; f.g[2][1]=1;f.g[2][2]=0; ll res=solve(); printf("%lld\n",res); } return 0; }
+++++++++++++++++++++++++++++++++++++++++++
+本文作者:luyouqi233。 +
+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+
+++++++++++++++++++++++++++++++++++++++++++