1202:Pell数列
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
Pell数列a1,a2,a3,...的定义是这样的,a1=1,a2=2,...,an=2an−1+an−2(n>2)。
给出一个正整数 k,要求Pell数列的第 k 项模上 32767 是多少。
【输入】
第1行是测试数据的组数 n,后面跟着 n 行输入。每组测试数据占 1 行,包括一个正整数k(1≤k<1000000)。
【输出】
n 行,每行输出对应一个输入。输出应是一个非负整数。
【输入样例】
2
1
8
【输出样例】
1
408
解析:直接递归
详见代码:
#include <bits/stdc++.h>
using namespace std;
int n;
int f(int y){
if (y==1) return 1;
if (y==2) return 2;
return (2*f(y-1)+f(y-2))%32767;
}
int main() {
cin>>n;
for(int i=1;i<=n;i++){
int x;
cin>>x;
cout<<f(x)<<endl;
}
return 0;
}
爆栈了。。。
改用记忆化搜索;
详见代码:
#include <bits/stdc++.h>
using namespace std;
int n;
int a[1000005];
int f(int y){
if (a[y]>0) return a[y];
if (y==1) return 1;
if (y==2) return 2;
return a[y]=(2*f(y-1)+f(y-2))%32767;
}
int main() {
cin>>n;
for(int i=1;i<=n;i++){
int x;
cin>>x;
cout<<f(x)<<endl;
}
return 0;
}
继续爆栈。。。。
只能用递推了,详见代码:
#include <bits/stdc++.h>
using namespace std;
int n;
int a[1000005];
int main() {
cin >> n;
a[1] = 1;
a[2] = 2;
for(int i = 3; i <= 1000000; i++) {
a[i] = (2 * a[i - 1] + a[i - 2]) % 32767;
}
for(int i = 1; i <= n; i++) {
int x;
cin >> x;
cout << a[x] << endl;
}
return 0;
}