这题根据公式可以得出规律
当出现 1 1时 表示达到循环节点
因此可以打表求余得出结果
但是至于为什么49 是最大周期
找到了点资料是说
每个数是有前两个数来决定
而数的结果只有0 到6 七种可能
因此是 7*7=49
只能意会了 而且还出现了奇怪的bug 把for循环换成while就一直wa
如果只有49次不是应该break的吗 为什么会re
#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(cin>>a>>b>>n,a||b||n)
{
int i;
for(i=3;i<10000;i++)
{
arr[i]=(a*arr[i-1]+b*arr[i-2])%7;
if(arr[i]==1&&arr[i-1]==1) break;
}
n=n%(i-2);
arr[0]=arr[i-2];
cout << arr[n] << endl;
}
return 0;
}
以下是re代码
#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))
#define ll __int64
#define MAXN 1000
#define INF 0x7ffffff
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
int num[10000];
int main()
{
num[1]=1;
num[2]=1;
int i,j;
int a,b,que;
int flag;
while(scanf("%d%d%d",&a,&b,&que)!=EOF)
{
if(a==0&&b==0&&que==0) break;
i=3;
while(1)
{
num[i]=(a*num[i-1]+b*num[i-2])%7;
if(num[i]==1&&num[i-1]==1) break;
i++;
}
flag=i-2;
if(que%flag)
printf("%d\n",num[que%flag]);
else
printf("%d\n",num[flag]);
}
return 0;
}
原文:http://www.cnblogs.com/sola1994/p/3923647.html