結果
問題 | No.1330 Multiply or Divide |
ユーザー |
![]() |
提出日時 | 2021-09-25 13:37:30 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
AC
|
実行時間 | 743 ms / 2,000 ms |
コード長 | 1,009 bytes |
コンパイル時間 | 202 ms |
コンパイル使用メモリ | 12,672 KB |
実行使用メモリ | 54,636 KB |
最終ジャッジ日時 | 2024-07-05 12:04:53 |
合計ジャッジ時間 | 7,615 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 46 |
ソースコード
import bisectfrom collections import defaultdictinf = 10 ** 18N, M, P = map(int, input().split())A = set(map(int, input().split()))A = list(A)last = max(A)if last > M:print(1)exit()WV = defaultdict(lambda: inf)for a in A:cnt = 1while a % P == 0:a //= Pcnt += 1if a == 1:continuex = acost = cntwhile x <= M:WV[x] = min(WV[x], cost)cost += cntx *= aWV = list(WV.items())WV.sort()item = []for w, v in sorted(WV):while item and item[-1][1] >= v:item.pop()item.append((w, v))if not item:print(-1)exit()ans = infW, V = zip(*item)for w, v in item:ww = w * lastif ww > M:ans = min(ans, v + 1)continuetarget = (M + ww - 1) // wwi = bisect.bisect_right(W, target)for j in range(-1, 2):if 0 <= i + j < len(item) and ww * W[i+j] > M:ans = min(ans, v + V[i+j] + 1)if ans >= inf:ans = -1print(ans)