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;
}