0
点赞
收藏
分享

微信扫一扫

OpenJ_Bailian - 2786 Pell数列

迎月兮 2022-06-29 阅读 67

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

程序代码:

错误:提交超时:

#include<cstdio>
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;
}

正确:

#include<cstdio>
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;
}

注意:

在处理长数组时,使用递归时经常会计算超时,原因是每一次递归都会从头开始,而使用数组一次性计算并存储所有的值,只需要输出即可。

运行结果:

OpenJ_Bailian - 2786  Pell数列_i++

 

 


举报

相关推荐

0 条评论