北邮ACM2017练习赛B. 斐波那契数列 矩阵快速幂

题目

思路

矩阵快速幂
快速幂

代码

#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*p2
Matrix 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^k
Matrix 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;
}