原题链接:HDU's ACM 1005 Number Sequece
分析:因为有MOD 7,所以f(n-1)、f(n-2)的取值只可能是{0,1,2,3,4,5,6}七种可能,故只可能出现7*7种组合形式。在大于等于50的范围内,必出现循环。且f(n)由f(n-1),f(n-2)决定,故当f(n-1),f(n-2)都为1时,表示已经出现循环。循环区间为再次出现两个1时的前个数字序号。
实现:
1.读入A, B, n
2.判断A, B, n是否都等于0,若是,则进入步骤8
3.判断n的值是否小于50,若是,则end=n
4.loop=49
5.计算f(i),判断f(i)==1&&f(i-1)==1是否为真,若是则循环区间为loop=i-2,则进入步骤5;否则++i,进入步骤5
6.n%=loop;if(n==0) res=f(loop);else res=f(n);
7.按格式输出结果res,进入步骤1
8.结束
AC code:
#include <stdio.h>
#define MAXN 49 + 10
#define MAX 49
int tmp[MAXN];
int main()
{
int A, B, n, res;
int loop, i, end;
while(scanf("%d%d%d", &A, &B, &n)==3){
if(!A && !B && !n)
break;
if(n<=MAX)
end = n;
else
end = MAX;
loop = 49;
for(i=1;i<=49;++i){
if(i==1||i==2)
tmp[i]=1;
else{
tmp[i] = (A*tmp[i-1]+B*tmp[i-2])%7;
if(tmp[i]==1 && tmp[i-1]==1){
loop = i-2;
break;
}
}
}
n %= loop;
if(!n)
res = tmp[loop];
else
res = tmp[n];
printf("%d\n", res);
}
return 0;
}