点击打开链接 #include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> using namespace std; int ye[7][7]; //可能出现的情况,用来存出现值得位置。 int circle , from; int a ,b, n, f[52]={0,1,1}; void find(int a, int b) { memset(ye, 0, sizeof(ye)); ye[1][1]=1; //ye[f[i-1]][f[i]]出现的位置。 for(int i = 3; i<52; i++) { f[i]=(a*f[i-1]+b*f[i-2])%7; if(ye[f[i-1]][f[i]]) //表示已经出现过了 { circle=i-1-ye[f[i-1]][f[i]]; //循环节的长度 from = ye[f[i-1]][f[i]]; //循环节出现的位置 break; } ye[f[i-1]][f[i]]=i-1; } printf("%d\n",f[from+((n-from)%circle)]); //不要忘记前面没有出现循环的数。 } int main() { while(~scanf("%d%d%d", &a, &b, &n)&&a+b+n!=0) { a=a%7; b=b%7; find(a, b); } return 0; }