OJ地址:https://vjudge.net/problem/OpenJ_Bailian-2786
Pell数列a 1, a 2, a 3, ...的定义是这样的,a 1 = 1, a 2 = 2, ... , a n = 2 * a n − 1 + a n - 2 (n > 2)。
给出一个正整数k,要求Pell数列的第k项模上32767是多少。
Input
第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数k (1 ≤ k < 1000000)。
Output
n行,每行输出对应一个输入。输出应是一个非负整数。
Sample Input
2
1
8
Sample Output
1
408
程序代码:
错误:提交超时:
int lcc(int x){
if(x==1){
return 1;
}else if(x==2){
return 2;
}else{
return 2*lcc(x-1)+lcc(x-2);
}
}
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
int k;
scanf("%d",&k);
printf("%d\n",lcc(k)%32767);
}
return 0;
}
正确:
const int maxN = 1000001;
int a[maxN];
void lcc(){
a[1]=1;
a[2]=2;
for(int i=3;i<maxN;i++)
a[i]=(2*a[i-1]+a[i-2])%32767;
}
int main(){
int n;
lcc();
scanf("%d",&n);
for(int i=0;i<n;i++){
int k;
scanf("%d",&k);
printf("%d\n",a[k]);
}
return 0;
}
注意:
在处理长数组时,使用递归时经常会计算超时,原因是每一次递归都会从头开始,而使用数组一次性计算并存储所有的值,只需要输出即可。
运行结果: