昨天我们浅谈了关于“肥不拉几”数列的题目,发现还是比较基础【水】的题
但:毕竟2.2的题都或多或少还是有些难度在的,不是所有的题都轻轻松松的打没有20行的代码就直接在ACder
所以我今天就带来一个比较坑的题目——Pell数列
Pell | 英[pel] | 美[pel] |
我们先来读题:
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
仿佛你在逗我玩……
好吧,不得不简化时间复杂度了
于是我想了一宿,终于……
就如上一题“肥不拉几”所做的那样,我创建了一个数组储存算出来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++ | 前天 |
mza | Accepted | 10 | 136kB | 14ms | 432 B | G++ | 3天前 |
我希望像上面那个人那样空间既少,时间也少
(如果正在看的你有好想法,请务必告诉我哦~)