题意就是用矩阵乘法来求斐波那契数列的第n项的后四位数。如果后四位全为0,则输出0,否则
输出后四位去掉前导0,也。。。就。。。是。。。说。。。输出Fn%10000。
题目说的如此清楚。。我居然还在%和/来找后四位还判断是不是全为0还输出时判断是否为0然后
去掉前导0。o(╯□╰)o
还有矩阵快速幂的幂是0时要特判。
P.S:今天下午就想好今天学一下矩阵乘法方面的知识,这题是我的第一道正式接触矩阵乘法的题,欧耶!
#include<cstdio> #include<iostream> #include<cstring> #define maxn 5 using namespace std; const int mod = 10000; int n,q; struct Mat { int mp[maxn][maxn]; bool operator = (Mat a) { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) mp[i][j] = a.mp[i][j]; } } }; Mat operator *(Mat a,Mat b) { Mat c; memset(c.mp,0,sizeof(c.mp)); for(int k=0;k<n;k++) { for(int i=0;i<n;i++) { if(a.mp[i][k]<=0) continue; for(int j=0;j<n;j++) { if(b.mp[k][j]<=0) continue; c.mp[i][j] = c.mp[i][j]+(a.mp[i][k]*b.mp[k][j])%mod; if(c.mp[i][j]>mod) c.mp[i][j]-=mod; } } } return c; } Mat operator ^(Mat a,int k) { Mat c; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) c.mp[i][j] = (i==j); } while(k) { if(k&1) c = c*a; a =a*a; k>>=1; } return c; } int main() { while(scanf("%d",&q)!=EOF) { if(q == -1) break; Mat x; x.mp[0][0] = 0; x.mp[0][1] = 1; x.mp[1][0] = 1; x.mp[1][1] = 1; Mat y; y.mp[0][0] = 0; y.mp[1][0] = 1; Mat z; n = 2; if(!q) { printf("0\n"); continue; } z = x^(q-1); Mat tmp = z*y; printf("%d\n",tmp.mp[1][0]%10000); } return 0; }
poj 3070 Fibonacci (矩阵快速幂求斐波那契数列的第n项),布布扣,bubuko.com
poj 3070 Fibonacci (矩阵快速幂求斐波那契数列的第n项)
原文:http://blog.csdn.net/u012841845/article/details/38497831