答案是一个非常简单的递归。F(1) = 2
因为F(n)
我们有两个选择:
n = H
,那么亲吻剩下的客人的方式数简直就是F(n-1)
n = K
,那么亲吻剩余客人的方式数就是公主不被强迫亲吻的剩余客人的数量2 ** k
。k
由于她必须亲吻剩下的每一位客人,k = ceil((n - 1) / 2)
把它们放在一起,我们得到F(n) = F(n - 1) + 2 ** ceil((n - 1) / 2)
我的尝试,包括采取一切 mod 1000000007:
from math import ceil
def F(n):
m = 1000000007
a = 2
for i in range(2, n+1):
a = (a + pow(2, int(ceil((i - 1.0) / 2)), m)) % m
return a
编辑:更新(更快,更不可读!F(1e9)
大约需要 3 分钟):
def F(n):
m = 1000000007
a = 2
z = 1
for i in xrange(2, n, 2):
z = (z * 2) % m
a = (a + z + z) % m
if (n & 1 == 0):
z = (z * 2) % m
a = (a + z) % m
return a
编辑2:经过进一步思考,我意识到上面实际上只是:
F(n) = (1 + 1) + (2 + 2) + (4 + 4) + ... + (2 ** n/2 + 2 ** n/2)
= 2 * (1 + 2 + 4 + ... + 2 ** n/2)
= 2 * (2 ** (n/2 + 1) - 1)
= 2 ** (n/2 + 2) - 2
但是如果n
是偶数,最后一个2 ** n/2
只出现一次,所以我们有:
def F(n):
m = 1000000007
z = pow(2, n/2, m)
if (n % 2 == 0):
return (z * 3 - 2) % m
else:
return (z * 4 - 2) % m
哪个运行得更快!(受速度限制pow(x, y, z)
,我认为是O(lg n)
?)
仅仅因为,这里是单线:
def F(n):
return (pow(2, n/2, 1000000007) * (3 + n % 2) - 2) % 1000000007
结果:
1 => 2
2 => 4
3 => 6
4 => 10
5 => 14
6 => 22
7 => 30
8 => 46
9 => 62
10 => 94
1e6 => 902893650
1e7 => 502879941
1e8 => 251151906
1e9 => 375000001