結果
問題 | No.2039 Copy and Avoid |
ユーザー |
![]() |
提出日時 | 2025-03-26 15:57:13 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,532 bytes |
コンパイル時間 | 355 ms |
コンパイル使用メモリ | 82,048 KB |
実行使用メモリ | 89,216 KB |
最終ジャッジ日時 | 2025-03-26 15:57:37 |
合計ジャッジ時間 | 6,694 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | TLE * 1 -- * 30 |
ソースコード
def factorize(n):factors = {}while n % 2 == 0:factors[2] = factors.get(2, 0) + 1n = n // 2i = 3while i * i <= n:while n % i == 0:factors[i] = factors.get(i, 0) + 1n = n // ii += 2if n > 1:factors[n] = 1return factorsdef generate_divisors(factors):divisors = [1]for p, exp in factors.items():current_length = len(divisors)p_pows = []for e in range(1, exp + 1):p_pows.append(p ** e)for pow_p in p_pows:for i in range(current_length):divisors.append(divisors[i] * pow_p)return sorted(divisors)def main():import sysinput = sys.stdin.read().split()idx = 0N = int(input[idx]); idx +=1M = int(input[idx]); idx +=1A = int(input[idx]); idx +=1B = int(input[idx]); idx +=1C = list(map(int, input[idx:idx+M]))forbidden_set = set(C)if N == 1:print(-1)returnfactors = factorize(N)divisors = generate_divisors(factors)if N not in divisors:divisors.append(N)divisors = sorted(divisors)dp = {d: float('inf') for d in divisors}dp[1] = 0for d in divisors:if d == 1:continuepossible_prevs = [prev for prev in divisors if prev < d and d % prev == 0]for prev in possible_prevs:s = d // previf s < 2:continueinvalid = Falsefor c in C:if c % prev != 0:continueq = c // previf 2 <= q <= s:invalid = Truebreakif not invalid:if dp[prev] + (s-1)*A + B < dp[d]:dp[d] = dp[prev] + (s-1)*A + Bmin_cost = float('inf')for d in divisors:if d >= N:continueif N % d != 0:continuek = (N // d) - 1if k < 0:continueinvalid = Falsefor c in C:if c < d * 2:continueif c > d * k:continueif c % d == 0:invalid = Truebreakif not invalid:total_cost = dp[d] + k * Aif total_cost < min_cost:min_cost = total_costprint(-1 if min_cost == float('inf') else min_cost)if __name__ == '__main__':main()