北邮ACM2017练习赛B. 斐波那契数列 矩阵快速幂 发表于 2017-04-08 | 分类于 ACM | 浏览 次 字数统计: 226 | 阅读时长 ≈ 1 题目 思路矩阵快速幂快速幂 代码#include <iostream>#include<cstdio>#include<cstring>using namespace std;const int mod = 10000;const int N = 2;//矩阵的维数,角标从0开始struct Matrix{ long long v[N][N]; Matrix() { memset(v,0,sizeof(v)); }};//矩阵的乘法p1*p2Matrix multi(Matrix p1,Matrix p2){ Matrix res; for(int i=0;i<N;i++) for(int j=0;j<N;j++) if(p1.v[i][j])//代码优化,是0的话就不用计算 for(int k=0;k<N;k++) res.v[i][k]=(res.v[i][k]+(p1.v[i][j]*p2.v[j][k]))%mod; return res;}//矩阵的快速幂p^kMatrix pow(Matrix p,long long k){ Matrix t; for(int i=0;i<N;i++)//初始化为单位矩阵 t.v[i][i]=1; while(k) { if(k&1) t=multi(t,p); p=multi(p,p); k=k>>1; } return t;}int main(){ long long n; Matrix e,ans; e.v[0][0]=e.v[0][1]=e.v[1][0]=1; e.v[1][1]=0; while(scanf("%I64dd",&n)!=EOF&&n!=-1) { ans = pow(e,n); printf("%I64d\n",ans.v[0][1]); } return 0;}