HDU's ACM 1005 Number Sequece

原题链接: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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值