Source
第一种方法:找出循环节s,
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int f[100000001]; int main() { f[1]=1; f[2]=1; int i,n,j; int a,b; while(scanf("%d%d%d",&a,&b,&n)!=EOF&&(a||b||n)) { int s=0; for(i=3; i<=n; i++) { f[i]=(a*f[i-1]+b*f[i-2])%7; for(j=2; j<i; j++) if(f[i-1]==f[j-1]&&f[i]==f[j]) { s=i-j; break; } if(s>0)break; } if(s>0) { f[n]=f[(n-j)%s+j]; } cout<<f[n]<<endl;; } return 0; } 第二种,由于最大mod为7,由鸽巢原理知最大状态数不超过7^7 #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <cmath> #include <set> using namespace std; int main() { int f[1001],n; int a,b,i; while(scanf("%d%d%d",&a,&b,&n)&&a+b+n) { f[1]=1; f[2]=1; for(i=3;i<=49;i++) { f[i]=(a*f[i-1]+b*f[i-2])%7; } printf("%d\n",f[n%48]); } return 0; }