一开始是直接按题目所给的递归,然后就超内存限制了,后来学了数组记忆化剪枝,预防了超时的问题,但是数组还是要开很大,因为n小于一亿,这样就会超内存,经过discuss里的提醒,循环是49(这种题目一定有个循环的,没有循环就必须超内存了,也就A不了了),之后修改一下,上交就A了,也算是我A的hdu的第七十道题目了
#include<iostream>
#include<cstdio>#include<cstring>
#define MAX 50
using namespace std;
int fun[MAX];
int f(int x,int y,int z)
{
if (fun[z%49])
return fun[z%49];
else return fun[z%49]=(x * f(x,y,z - 1) + y * f(x,y,z - 2))%7;
}
int main()
{
int A,B,n;
while(scanf("%d %d %d",&A,&B,&n),A+B+n)
{
memset(fun,0,sizeof(fun));
fun[1]=fun[2]=1;
cout<<f(A,B,n)<<endl;
}
return 0;
}
(1).上篇博客强调了开一块内存要初始化,对于这种重复案例的情况,更是要注意在运行新的案例时让一切条件回复到一开始的初始化状态,在这个题目就体现在memset(fun,0,sizeof(fun));语句上。