按规律求出第n项。
由矩阵乘法我们可以知道:
然后我们构造出这个矩阵就成了。
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int mod=7;
struct mat
{
int m[10][10];
};
mat mul(mat x,mat y)
{
mat c;
for(int i=0;i<2;i++)
{
for(int j=0;j<2;j++)
{
c.m[i][j]=0;
}
}
for(int i=0;i<2;++i){
for(int j=0;j<2;++j){
for(int k=0;k<2;++k){
c.m[i][j] = (c.m[i][j]%mod + x.m[i][k]*y.m[k][j]%mod)%mod;
}
}
}
return c;
}
mat pow(mat x,int y)//矩阵快速幂
{
mat ans;
for(int i=0;i<2;i++)
{
for(int j=0;j<2;j++)
{
if(i==j)
ans.m[i][j]=1;
else
ans.m[i][j]=0;
}
}
while(y){
if(y&1) ans = mul(ans,x);
x = mul(x,x);
y>>=1;
}
return ans;
}
int main()
{
int a,b,n;
while(cin>>a>>b>>n)
{
if(a+b+n==0)
break;
mat ans;
ans.m[0][0]=a;
ans.m[0][1]=1;
ans.m[1][0]=b;
ans.m[1][1]=0;
ans=pow(ans,n-1);
cout<<(ans.m[0][1]+ans.m[1][1])%mod<<endl;
}
return 0;
}
还有一种方法,我们知道菲波那契是循环的 然后我们找到这个循环节就行了 看别人博客说 数据最大的循环节就是47。
#include<iostream>
#include<string>
#include<algorithm>
#include<iomanip>
#include<cmath>
int F[48];
using namespace std;
int main()
{
int A,B,n,i;
F[1]=1;F[2]=1;
while(cin>>A>>B>>n&&A!=0&&B!=0&&n!=0)
{
for(i=3;i<=47;i++)
F[i]=(A*F[i-1]+B*F[i-2])%7;
cout<<F[n%48]<<endl;
}
}