【题目描述】
给定a0,a1,以及an=p*a(n-1) + q*a(n-2)中的p,q。这里n >= 2。 求第k个数对10000的模。
【输入描述】
输入包括5个整数:a0、a1、p、q、k。
【输出描述】
第k个数a(k)对10000的模。
【输入】
20 1 1 14 5
【输出】
8359
【解题思路】
在这道题里,由于题目就是“递推数列”,所以我就很自然而然的使用了递归。
递归结束标识就是当自变量变成0/1.
代码如下:
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int a0,a1,p,q,k=0;
int digui(int k){
if(k==0){
return a0;
}
else if(k==1)
return a1;
else
return p*digui(k-1)%10000+q*digui(k-2)%10000;
}
int main(){
while(cin>>a0>>a1>>p>>q>>k){
cout<<digui(k)%10000<<endl;
}
return 0;
}
然后就超时了。递归的效率确实很慢。但是在此基础上加上几行代码后,效率就提高了很多。
“记忆递归型的动态规划程序”
所以在接下来中,我们应该将每一步算出来的值存放在一个数组中,这样的话就可以直接取了。大大降低了时间。
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int a0,a1,p,q,k=0,f[1000010];
int digui(int k){
if (f[k]!=-1) return f[k];
if(k==0){
return a0;
}
else if(k==1)
return a1;
else
return f[k]=p*digui(k-1)%10000+q*digui(k-2)%10000;
}
int main(){
while(cin>>a0>>a1>>p>>q>>k){
for (int i=0; i<=k; i++) f[i]=-1;
cout<<digui(k)%10000<<endl;
}
return 0;
}
推荐链接:https://blog.csdn.net/summer070825/article/details/76572434