#include <iostream> using namespace std; int main(){ int a,b,n,m; int f[50]; while(cin>>a>>b>>m){ if(a==0&&b==0&&m==0) break; f[1]=1; f[2]=1; for(n=3;n!=50;n++){ f[n]=(a*f[n-1]+b*f[n-2])%7; if(f[n]==1&&f[n-1]==1) break; } m=m%(n-2); if(m==0) cout<<f[n-2]<<endl; //因为f[0]=0 else cout<<f[m]<<endl; } return 0; }
循环节
一开始的做法是:
#include <iostream> using namespace std; long long F[100000001]; int a,b,n,sum; int ff(int m){ if(m==1||m==2) return 1; if(F[m]!=0) return F[m]; for(int i=3;i<=m;i++){ sum=(a*ff(i-1)+b*ff(i-2))%7; F[i]=sum; } return F[m] ; } int main(){ while(cin>>a>>b>>n){ memset(F,0,sizeof(F)); F[1]=F[2]=1; if(a==0&&b==0&&n==0) break; int s=ff(n); cout<<s<<endl; } return 0; }
但是这样报错,看网上有一种解法:用循环节
%7只有7种结果,所以
f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
f(n)有49种结果,在50之内必有循节。