結果
問題 |
No.1529 Constant Lcm
|
ユーザー |
![]() |
提出日時 | 2025-03-31 17:58:00 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 137 ms / 3,000 ms |
コード長 | 2,035 bytes |
コンパイル時間 | 220 ms |
コンパイル使用メモリ | 82,504 KB |
実行使用メモリ | 109,384 KB |
最終ジャッジ日時 | 2025-03-31 17:58:45 |
合計ジャッジ時間 | 3,282 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 24 |
ソースコード
import sys MOD = 998244353 def main(): N = int(sys.stdin.readline()) if N == 1: print(1) return sieve_max = max(2, N) sieve = [True] * (sieve_max + 1) sieve[0] = sieve[1] = False for i in range(2, int(sieve_max**0.5) + 1): if sieve[i]: sieve[i*i : sieve_max+1 : i] = [False] * len(sieve[i*i : sieve_max+1 : i]) primes = [p for p in range(2, sieve_max) if sieve[p]] factors = {} nn = N for p in primes: if p * p > nn: break if nn % p == 0: count = 0 while nn % p == 0: count += 1 nn = nn // p factors[p] = count if nn > 1 and nn <= sieve_max and sieve[nn]: factors[nn] = 1 result = 1 for p in primes: if p > N - 1: continue if p in factors: e = factors[p] m = N // (p ** e) s_case1 = e current = p ** e case1_max = 0 if current <= N - 1: while current * p <= N - 1: current *= p s_case1 += 1 case1_max = s_case1 + e case2_max = 0 for s in range(1, e + 1): power = p ** (e - s) term = power * m val = term - 1 if val == 0: continue k = 0 while val % p == 0 and val != 0: k += 1 val = val // p current_sum = 2 * s + k if current_sum > case2_max: case2_max = current_sum e_p = max(case1_max, case2_max) else: t_max = 0 current = 1 while current * p <= N - 1: current *= p t_max += 1 e_p = t_max if e_p > 0: result = (result * pow(p, e_p, MOD)) % MOD print(result % MOD) if __name__ == '__main__': main()