题目描述:
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 是多少。
输入格式
第 1 行是测试数据的组数 n(1≤n≤20),后面跟着 n 行输入。每组测试数据占 1 行,包括一个正整数 k(1≤k<1000000)。
输出格式
n 行,每行输出对应一个输入。输出应是一个非负整数。
输出时每行末尾的多余空格,不影响答案正确性
样例输入 复制
2
1
8
样例输出 复制
1
408
题目解释:
第一步分析:该问题可以用递归来解决,所以可以用动态规划的方式来解决
第二步分析:找到状态转移方程:a[n] = 2 * a[n-1] + a[n-2],可以用三个变量来表示,result表示a[n],pre表示a[n-1],next表示a[n-2]
第三步分析:对result进行取模操作,即result = (2 * pre + next) % 32767,利用循环可以得到最终的result
源代码:
#include<iostream>
using namespace std;
int main(){
int n,t[10000],result,pre,next;
cin >> n;
for(int i = 0; i < n; i++){
cin >> t[i];
}
for(int i = 0; i < n; i++){
if(t[i] == 1){
cout << 1 << endl;
continue;
}
else if(t[i] == 2){
cout << 2 << endl;
continue;
}
else{
result = 0;
pre = 2;
next = 1;
for(int j = 3; j <= t[i]; j++){
result = (2 * pre + next) % 32767;
next = pre;
pre = result;
}
cout << result << endl;
}
}
return 0;
}