結果
問題 |
No.2318 Phys Bone Maker
|
ユーザー |
|
提出日時 | 2025-03-09 04:21:59 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,734 ms / 3,000 ms |
コード長 | 1,679 bytes |
コンパイル時間 | 503 ms |
コンパイル使用メモリ | 81,680 KB |
実行使用メモリ | 79,548 KB |
最終ジャッジ日時 | 2025-03-09 04:22:16 |
合計ジャッジ時間 | 16,562 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 45 |
ソースコード
## https://yukicoder.me/problems/no/2318 import math from collections import deque MOD = 998244353 def main(): N = int(input()) # 素因数分解 sqrt_n = int(math.sqrt(N)) n = N primes = {} for p in range(2, sqrt_n + 1): if n % p == 0: primes[p] = 0 while n % p == 0: n //= p primes[p] += 1 if n > 1: primes[n] = 1 primes_key = list(primes.keys()) primes_key.sort() # 約数列挙 divisors = [] for p in range(1, sqrt_n + 1): if N % p == 0: q = N // p divisors.append(p) if q != p: divisors.append(q) divisors.sort() divisors2 = [] for d in divisors: c_array = [] for p in primes_key: c = 0 while d % p == 0: d //= p c += 1 c_array.append(c) divisors2.append(tuple(c_array)) dp = {divisors2[0]: 1} for i in range(1, len(divisors2)): x = divisors2[i] ans = 0 for j in range(i): y = divisors2[j] is_ok = True for k in range(len(x)): if x[k] < y[k]: is_ok = False break if is_ok: a = 1 for k in range(len(x)): if x[k] == y[k]: a *= (y[k] + 1) a %= MOD ans += (a * dp[y]) % MOD ans %= MOD dp[x] = ans print(dp[divisors2[-1]]) if __name__ == "__main__": main()