Pell数列 总时间限制: 3000ms 内存限制: 65536kB 描述 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行,每行输出对应一个输入。输出应是一个非负整数。 样例输入 2 1 8 样例输出 1 408
#include<cstdio>#include<iostream>#include<cmath>#include<cstring>using namespace std;#define Max_N 1000001int Pell[Max_N];int main(){ int T; cin >> T; while(T--) { int n; cin >> n; Pell[1] = 1; Pell[2] = 2; for(int i = 3;i <= n; i++) { Pell[i] = Pell[i-1] * 2 + Pell[i-2]; Pell[i] %= 32767; } cout << Pell[n] <<endl; } return 0;}思路: 本来这里是道递归练习题,所以先用递归写的。然而怎么弄都是time limited error。于是改用循环写。 注意两点:1.改用数组和循环写。注意数组要定义得足够大。 2.因为到后面数据过大可能溢出,而且结果要求对32767取余。所以每一次循环都对32767取余。可以保证得到所要的答案且再运行过程中不会出现溢出。
代码参考自:http://www.cnblogs.com/geek-007/p/5660957.html
提出点优化,可以不用定义这么大的数组,只用三个数,往返赋值,也可以做到。不过既然题不难,而且已经accepted,博主就没有修改代码了。留给后人吧(虽然不一定有人看到)。
新闻热点
疑难解答