您的位置:首页 > 其它

数字序列

2016-05-17 21:33 162 查看
思路:由于数字序列与7作模运算(mod7),而且每个数只与前面紧邻的两个数有关,因此,最多7*7次之后序列会出现环,也即是50次之内必然出现环,因此可先求出前50次的子序列的值,然后通过比较判断出现环的起始及结束位置,以此为基础将n的值等价于前50次内某个值。本代码在求环起始与结束位置时,使用nums[i]*7+nums[i+1]记录,当再次出现该值时,则表示该值为环的起始位置,环的大小为当前出现该值的位置减去第一次出现该值的位置
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int nums[51]={1,1};
int num1[51];
int main()
{
int A,B,n;
while(scanf("%d%d%d",&A,&B,&n)==3&&(A!=0||B!=0||n!=0))
{
int m=min(50,n);
for(int i=2;i<m;i++)
{
nums[i]=(A*nums[i-1]+B*nums[i-2])%7;
}
if(n<=50)
{
printf("%d\n",nums[n-1]);
}
else
{
memset(num1,-1,sizeof(num1));
int rec;
int index;
for(int i=0;i<49;i++)
{
int num=nums[i]*7+nums[i+1];
if(num1[num]!=-1)
{
index=num1[num];
rec=i-num1[num];
break;
}
else
{
num1[num]=i;
}
}
int result=nums[index+(n-index-1)%rec];
printf("%d\n",result);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: