如题,一串无规律数组,可能从第n个数字开始以d为长度循环,试图找出这个d。
代码:
#include <cstdio>
#include <vector>
using namespace std;
#define MAXN 1000 //预测最大循环d的值
vector<int> num;
int main()
{
int a,b,n;
while(scanf("%d%d%d",&a,&b,&n)!=EOF)
{
if(a==0&&b==0&&n==0) break;
num.clear();
num.push_back(1);
num.push_back(1);
int first = 1; //递推公式f(n-1)
int second = 1; //递推公式f(n-2)
int f; //递推公式f(n)
int d = 1; //迭代加深d
int cnt = 1; //vector下标
int flagtrue= 0; //元素相等计数
int flagfalse = 0; //元素不等计数
while(flagtrue < MAXN)
{
//递推公式计算f(n)
f = (a*first+b*second)%7;
num.push_back(f);
second = first;
first = f;
cnt++;
//当元素持续相等超过可信阈值后,可以认为已经出现循环节
if(num[cnt] == num[cnt-d])
{
flagtrue++;
}else
{
flagtrue = 0;
flagfalse ++;
}
//当元素不等超过阈值后,迭代加深d的值
if(flagfalse > MAXN)
{
d++;
flagfalse=0;
}
}
if(n-1>cnt) printf("%d\n",num[cnt-d+(n-1-cnt)%d]);
else printf("%d\n",num[n-1]);
}
return 0;
}