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; }
时间: 2024-10-12 16:33:19