标签:
先来一种简单的情况,用矩阵快速幂计算斐波那契数列;
下面的代码很好理解
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct mat{
int at[2][2];
};
mat d;
int n,mod;
mat mul(mat a,mat b)
{
mat t;
memset(t.at,0,sizeof(t.at));
for(int i=0;i<n;++i)
{
for(int k=0;k<n;++k)
{
if(a.at[i][k])
for(int j=0;j<n;++j)
{
t.at[i][j]+=a.at[i][k]*b.at[k][j];
if(t.at[i][j]>=mod){t.at[i][j]%=mod;}
}
}
}
return t;
}
mat expo(mat p,int k)
{
if(k==1)return p;
mat e;
memset(e.at,0,sizeof(e.at));
for(int i=0;i<n;++i){e.at[i][i]=1;}
if(k==0)return e;
while(k)
{
if(k&1)e=mul(p,e);
p=mul(p,p);
k>>=1;
}
return e;
}
int main()
{
n=2;mod=10000;
d.at[1][1]=0;
d.at[0][0]=d.at[1][0]=d.at[0][1]=1; //这样的矩阵不断的********就好了,就能计算出了,不难模拟。然后既然这样的话就快速幂一下
int k;
while(~scanf("%d",&k))
{
if(k==-1)break;
mat ret=expo(d,k);
int ans=ret.at[0][1]%mod;
printf("%d\n",ans);
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/fighting-to-the-end/p/5031135.html