最大長100万の英小文字列の好きな場所に最大100万回英小文字を挿入して、できる可能性のある文字列を数え上げる問題。問題文
コンテスト中の思考
解説を読んでからコンテスト後
サンプル1に正解するコード python
K = 5
S = "oof"
P = 10 ** 9 + 7
N = len(S)
def factorial(n):
ret = 1
for i in range(2, n + 1):
ret *= i
return ret
def comb_rep(n, r):
return factorial(n + r - 1) // factorial(r) // factorial(n - 1)
ret = 0
for i in range(K + 1):
ret += (
(25 ** i) *
(26 ** (K - i)) *
comb_rep(N, i)
)
print(ret)
inv[a] = MOD - inv[MOD % a] * (MOD / i) % MOD;python
f = 1
invf = 1
for i in range(2, N + K):
f *= i
f %= P
F[i] = f
q, r = divmod(P, i)
INV[i] = -INV[r] * q % P
invf *= INV[i]
invf %= P
INVF[i] = invf
サブミットしてみたらTLEだった
手元での速度比較 :
pure python
real 0m2.910s
user 0m2.781s
sys 0m0.124s
compiled with numba
real 0m0.363s
user 0m0.683s
sys 0m0.139s
numbaでどれくらい速くなるのか測ってみたのだが、userがrealを超えてるな…なにも考えてないPythonのコードがマルチスレッド(GIL OFF)で走るということ??
#atcoder #ABC171