1005:Number Sequence

解决HDU1005数列问题,通过找规律避免直接计算导致的超时。分析表明,对于固定的A、B,存在49种组合,每种组合有特定周期。关键在于动态找出周期及起始位置,以高效计算数列值。
摘要由CSDN通过智能技术生成

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1005

方法:找规律

思路:直接做也没啥问题,如果多次求模的话不会爆int的,但是会超时。也就是说我们不能直接得到n之后就去运算,一直算到n为止,这样时间上消耗太大。转换思路,求模一般是有规律,这个题也不例外,但是由于A、B不同,这种规律也不相同,但是在A、B一定的情况下,只有7*7=49种组合。只要在选定AB的情况下找到对应的周期,我们就不用一直算到n了。另外,值得注意的是,这个周期不一定是从f1就是周期的第一个数,因此周期的开始位置也是需要寻找的。

难点:动态的寻找周期,寻找周期起始位置。

#include <cstdio>
using namespace std;
const int N = 100000005;
int f[N]={0};
int main()
{
    int a,b,n;
    int i,j;
    while(~scanf("%d%d%d",&a,&b,&n))
    {
        if(a == 0&&b == 0&&n == 0) break;
        f[1] = f[2] = 1;
        int period = 0;//记录周期
        for(i = 3;i <= n;i++)//注意是从3开始递推
        {
            f[i] = (a*f[i-1]+b*f[i-2])%7;
            for(j =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值