解決したいこと
以下のコードを提出しましたが、TLEとなってしまいました。
(44ファイル中12ファイルTLE)
計算量を改善するにはどうすべきだったのでしょうか。
問題は以下の通りです。
https://atcoder.jp/contests/abc158/tasks/abc158_e
疑問点と知りたいこと
自分の予想では、Numpyを使えば繰り返し内部の計算量はO(1)程度だと予測し、全体の計算量はO(N)程度であり、問題ないと考えていました。
しかし、実際にはTLEとなってしまい、O(10^9)以上の計算量が必要となっていたと考えられます。
このコードの計算量はどれほどだったのでしょうか。また、それはどのようにして予測できたのでしょうか。
該当のソースコード
python
1s = list(map(int, input().strip())) 2 3dp = np.zeros(p,dtype = int) #動的計画法 4 5count = 0 6d = 1 7for i in range(n): #1の位から順に数を追加していく 8 ne_ar = np.zeros(p,dtype = int) 9 if(p == 2 or p == 5): #10と互いに素ではない場合 10 ne = int(s[n-i-1]) % p 11 if(ne == 0): 12 dp[0] += 1 13 count += dp[0] # 14 else: 15 ne = (int(s[n-i-1]) * d) % p #10とは互いに素なので、sと同じ位で考えて良い 16 ne_ar[ne:] += dp[:(p-ne)] #新しく追加する数の余りをずらす 17 ne_ar[:ne] += dp[(p-ne):] 18 ne_ar[ne] += 1 #新しい数のみの時 19 dp = ne_ar 20 d *= 10 21 d %= p 22 count += ne_ar[0] #neを一番上の位とする部分集合の数を足す 23 24print(count) 25
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/13 17:03
2020/06/13 17:53
2020/06/14 09:47