题目描述
Pell数列a1, a2, a3, ...的定义是这样的,a1 = 1, a2 = 2, ... , an = 2 * an − 1 + an - 2 (n > 2)。
给出一个正整数k,要求Pell数列的第k项模上32767是多少。
输入
第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数k (1 ≤ k < 1000000)
输出
n行,每行输出对应一个输入。输出应是一个非负整数。
递推问题
1.特殊处理无法递推的项(一般都是第1,2项)
2.找规律
3.按规律预处理(看情况,如果项数少就直接预处理)
头文件
#include<iostream>
using namespace std;
int k[1000005];//虽然题目说正整数k的范围是1<=k<=1000000,但咱们可以稍微大方一丢丢,开个1000005
int main();
int n,i,j,s,b;
cin>>n;
k[1]=1;//数列的第一个数字是‘1’
k[2]=2;//数列的第二个数字是‘2’
for(i=3;i<=1000000;i++)//因为数组的第一个和第二个数字已经赋值了,所以i从3开始遍历到1000000
{
k[i]=(2*k[i-1]+k[i-2])%32767;//数列的第i项是2*(a[i-1]+a[i-2])
//因为最后要输出pell数列的第k项%32767,所以就直接在这里%32767
}
for(i=1;i<=n;i++)//输出n行,(非负整数)
{
cin>>b;
cout<<k[b]<<endl;//输出pell数列第k项,因为之前已经处理过了第k项%32767,所以可以直接输出
}
所以最后整理一下就可以accept啦
#include<iostream>
using namespace std;
int a[1000005];
int main()
{
int n,i,j,k,s;
cin>>n;
a[1]=1;
a[2]=2;
for(i=3;i<=1000000;i++)
{
a[i]=(2*a[i-1]+a[i-2])%32767;
}
for(i=1;i<=n;i++)
{
cin>>k;
cout<<a[k]<<endl;
}
return 0;
}
样例输入 样例输出
2 1 1 408 8