天天看点

解题报告: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;
}      

代码改变世界