• 解题报告:hdu 1005 number subsequent



    2017-09-06 20:35:59

    writer:pprp

    本来以为这是一道水题,写了一个递归就赶紧交上去了,

    结果超时了,看看数据范围100000000,肯定把栈给爆了

    想用记忆化的方法,但是虽然快一点,但是开不到那么大的数组

    然后去看了看讨论版,大佬找到一个循环节

    这样的题,mod了一个7,结果会出现循环,循环节为 7 * 7 = 49

    因为结果一定是0到6之间的数,所以一定会循环,而且循环节不会超过49。(因为前面2个数若相同,则第三个之后的数必相同,而在49内必能找到2个相邻的数在前面出现过)

    代码如下:

    /*
    @theme: Number suquence
    @writer:pprp
    @begin:19:55
    @end:20:22
    @declare:简单递归竟然不可以!!!
    @error:
    @data:2017/9/6
    */
    
    #include <bits/stdc++.h>
    
    using namespace std;
    const int MAXN = 49;
    int a, b;
    int dp[MAXN];
    
    
    int fun(long long n)
    {
        for(int i = 3; i < MAXN; i++)
            dp[i] = (a * dp[i-1] + b * dp[i-2] )% 7;
        return dp[n % MAXN];
    }
    
    int main()
    {
        //freopen("in.txt","r",stdin);
        memset(dp,0,sizeof(dp));
        dp[1] = dp[2] = 1;
        long long n;
        while( cin >> a >> b >> n)
        {
            if(a==0&&b==0&&n==0)
                break;
            cout << fun(n) << endl;
        }
        return 0;
    }

     

  • 相关阅读:
    python基础:多进程讲解
    vue 导出数据
    vue 导入excel数据组件
    vue 分页组件
    vue 点击空白区域隐藏div
    vue 类似淘宝选择地址组件
    js基础练习经典题(数组,质数,数组的遍历等等)
    js去重复
    理解CSS3里的Flex布局用法
    书写HTML5/CSS3的命名规则
  • 原文地址:https://www.cnblogs.com/pprp/p/7486853.html
Copyright © 2020-2023  润新知