题意:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
求 f(n)
思路:
这题根据公式可以得出规律
当出现 1 1时 表示达到循环节点
因此可以打表求余得出结果
但是至于为什么49 是最大周期
找到了点资料是说
每个数是有前两个数来决定
而数的结果只有0 到6 七种可能
因此是 7*7=49
#include<stdio.h> #include<string.h> #include<math.h> #include<iostream> #include<algorithm> #include<queue> #include<stack> #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; int arr[10000]; int main() { arr[1]=arr[2]=1; int a,b,n; while(scanf("%d%d%d",&a,&b,&n),a||b||n) { int i,j; int l1,len; for(i=3;i<10000;i++) { arr[i]=(a*arr[i-1]+b*arr[i-2])%7; for(j=1;j<=i-1;j++) { if(arr[i]==arr[j]&&arr[i-1]==arr[j-1]) { l1=j-1; len=i-j; break; } } } if(n>=l1) { n=(n-(l1-1))%len+(l1-1); } arr[0]=arr[len+l1-1]; cout << arr[n] << endl; } return 0; }
重新看了题解 还是想不通为什么循环节在 1 1 又写了个自己判断循环节的
#include<stdio.h> #include<string.h> #include<math.h> #include<iostream> #include<algorithm> #include<queue> #include<stack> #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; int arr[10000]; int main() { arr[1]=arr[2]=1; int a,b,n; while(scanf("%d%d%d",&a,&b,&n),a||b||n) { int i,j; int l1,len; for(i=3;i<10000;i++) { arr[i]=(a*arr[i-1]+b*arr[i-2])%7; for(j=1;j<=i-1;j++) { if(arr[i]==arr[j]&&arr[i-1]==arr[j-1]) { l1=j-1; len=i-j; break; } } } if(n>=l1) { n=(n-(l1-1))%len+(l1-1); } arr[0]=arr[len+l1-1]; cout << arr[n] << endl; } return 0; }