これに対する答えは、非常に単純な再帰です。2 つの選択肢があります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
は 1 回しか発生しないため、次のようになります。
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