【水题例题选讲】Pell数列--斐波拉契数列的进阶

昨天我们浅谈了关于“肥不拉几”数列的题目,发现还是比较基础【水】的题

但:毕竟2.2的题都或多或少还是有些难度在的,不是所有的题都轻轻松松的打没有20行的代码就直接在ACder

所以我今天就带来一个比较坑的题目——Pell数列

Pell [pel] [pel]

 
一卷羊皮纸;
(度娘告诉我这个Pell意思是 一卷羊皮纸

我们先来读题:

1788:Pell数列

总时间限制: 
3000ms 
内存限制: 
65536kB
描述
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,后面跟着n行输入。每组测试数据占1行,包括一个正整数k (1 ≤ k < 1000000)。
输出
n行,每行输出对应一个输入。输出应是一个非负整数。
样例输入
2
1
8
样例输出
1
408
全局题号
1788
添加于
2015-12-16
提交次数
6137
尝试人数
1888
通过人数
1609

嗯……初看题目,很快得出递归式:f(k)=2*f(k-1)+f(k-2)和边界条件f(1)=1,f(2)=2

莫非真是和昨天讲的一样的水题?

不急,我们再往下看:

要求模(就是取余运算%)32767,嗯……这个要求还算好,因为我们数学上有定义:

若a=b+c,则a%k=b%k+c%k

嗯,传返回值的时候“顺便”模一下就行了

这样即使k很大时,也不需用到高精度运算了

于是我就这样欢天喜地的做了出来,欢天喜地的交了题

C20191721 Time Limit Exceeded 0 132kB 3001ms 228 B G++ 7天前

Time Limit Exceeded


Time Limit Exceeded


仿佛你在逗我玩……

好吧,不得不简化时间复杂度了

于是我想了一宿,终于……

就如上一题“肥不拉几”所做的那样,我创建了一个数组储存算出来Pell数列的值

因为题目要求k<=1000000,所以创建k[1000005];

伪代码如下:

int k[1000005];

int f(int x)

{

if(k[x]没有值)算出k[x]的值

返回k[x]模32767的值

}

当然,这样也有代价:

C20191721 Accepted 10 50816kB 99ms 344 B G++ 前天
50000KB!!!

mza Accepted 10 136kB 14ms 432 B G++ 3天前

我希望像上面那个人那样空间既少,时间也少

(如果正在看的你有好想法,请务必告诉我哦~)

猜你喜欢

转载自blog.csdn.net/tiw_air_op1721/article/details/61933278