前提・実現したいこと・発生している問題
AtCoder ABC171について、解説通りにコードを書いたつもりでしたが、30ケース中14例でTLEとなってしまいました。
どのように高速化をすれば良いかを教えていただけますでしょうか。
問題:https://atcoder.jp/contests/abc171/tasks/abc171_f
また、解説では「適切な前処理をすれば」とありました。↓
解説PDF: https://img.atcoder.jp/abc171/editorial.pdf
私は「階乗とコンビネーションを先に処理して持っておく」ことだと考えたのですが、本来は何を指していたのでしょうか。
よろしくお願い致します
該当のソースコード
Python
1import math 2k = int(input()) 3s = input() 4 5ss = len(s) 6 7mod = 10**9 + 7 8 9m25 = [] # 25の階乗をmodで割ったあまりを記録する配列 10m26 = [] # 26の階乗 11mfc = [] # ss+k-i-1 C ss-1 をi=kから記録していく 12a = 1 13b = 1 14c = 1 15 16for i in range(k+1): 17 m25.append(a) 18 a *= 25 19 a %= mod 20 21for i in range(k+1): 22 m26.append(b) 23 b *= 26 24 b %= mod 25 26for i in range(k): 27 mfc.append(c) 28 c *= ss + i # 分子の変化 29 c = c // (i+1) #分母の変化 割り算が入るためmod計算は後回し 30mfc.append(c) # 最後の項なのであとで足しておく 31 32samu = 0 33for i in range(k+1): 34 sm = mfc[k-i] #かなり大きな数になっていると考えられるので、次で一度mod計算 35 sm %= mod 36 sm *= m25[k-i] 37 sm *= m26[i] 38 sm %= mod 39 samu += sm 40 41samu %= mod 42print(samu) 43 44
試したこと
PyPyでの提出でもTLE数は変化しませんでした。
また初めはループ内で毎回コンビネーションを計算していましたが、ほぼ前例TLEとなりました。
以下の解答例を参考に考えましたが、前処理が何をしているのかわかりませんでした。
https://atcoder.jp/contests/abc171/submissions/14562582
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/27 01:49