zoukankan      html  css  js  c++  java
  • 解题报告: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;
    }

     

  • 相关阅读:
    pexpect模块
    Python正则表达式
    telnetlib
    paramiko
    threadpool和Queue
    logging
    Python异常
    Python迭代器
    程序员工资那么高,却从不炫富?网友回复让人“笑喷了”!
    小白到web前端工程师需要学习哪些知识?
  • 原文地址:https://www.cnblogs.com/pprp/p/7486853.html
Copyright © 2011-2022 走看看