杭电OJ1005-C语言


    计算此题时,极易因n过大造成超时;

    此时转换思路找规律:后面的f[i]全是基于%7运算得到的,而%7运算的结果只有{0,1,2,3,4,5,6} 这7种情况,也就是说f[i]、f[i-1]、f[i-2]、、、每个数都只有可能取7个数字的一个;

    f[i]=(a*f[i-1]+b*f[i-2])%7,此式中,每次参与运算的a和b都是固定的值,而f[i-1]、f[i-2]的值来源于前面的计算结果,也决定了后面的计算结果,因此这个计算的结果必定会出现循环,而f[i-1]、f[i-2]各有7种取法,因此由不同的f[i-1]、f[i-2]得出的f[i]有7*7=49种可能取法,则循环中的一个参照组至多包含49个f[i],第50个f[i]必然循环,因此设一个f[49]数组,存储每个f[i],只需计算49-2=47次,便可得出循环参照组(f[49]);再用n计算其在f[49]中对应的数值即可;

    用此找规律方法将大大缩短当n值过大时的计算时间。


#include "stdio.h"
int main(){
	int a, b, n;
	while (scanf("%d %d %d", &a, &b, &n)&&(a||b||n)){
		int f[49] = { 1, 1 };
		for (int i = 2; i < 49; i++){
			f[i] = (a*f[i - 1] + b*f[i - 2]) % 7;
		}
		printf("%d\n", f[(n - 1) % 49]);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值