結果
問題 |
No.3038 シャッフルの再現
|
ユーザー |
![]() |
提出日時 | 2025-06-12 13:47:54 |
言語 | PyPy3 (7.3.15) |
結果 |
RE
|
実行時間 | - |
コード長 | 3,486 bytes |
コンパイル時間 | 357 ms |
コンパイル使用メモリ | 82,532 KB |
実行使用メモリ | 68,388 KB |
最終ジャッジ日時 | 2025-06-12 13:48:33 |
合計ジャッジ時間 | 2,483 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | RE * 1 |
other | RE * 21 |
ソースコード
import sys from math import gcd MOD = 10**9 + 7 def factorize(n): factors = {} while n % 2 == 0: factors[2] = factors.get(2, 0) + 1 n = n // 2 i = 3 while i * i <= n: while n % i == 0: factors[i] = factors.get(i, 0) + 1 n = n // i i += 2 if n > 1: factors[n] = 1 return factors def generate_divisors(factors): divisors = [1] for p in sorted(factors.keys()): exp = factors[p] current_powers = [p**e for e in range(1, exp+1)] new_divisors = [] for d in divisors: for power in current_powers: new_divisors.append(d * power) merged = [] i = j = 0 len_div = len(divisors) len_new = len(new_divisors) while i < len_div and j < len_new: if divisors[i] < new_divisors[j]: merged.append(divisors[i]) i += 1 else: merged.append(new_divisors[j]) j += 1 merged += divisors[i:] merged += new_divisors[j:] divisors = merged return divisors def fast_doubling_pair(n, mod): if n == 0: return (0, 1) a, b = 0, 1 s = bin(n)[2:] for bit in s: c = a * ((2 * b - a) % mod) d = (a * a + b * b) % mod if bit == '1': a, b = d, (c + d) % mod else: a, b = c, d return (a, b) def compute_tau(p): if p == 2: return 3 if p == 5: return 20 mod5 = p % 5 if mod5 in (1, 4): m = p - 1 else: m = 2 * (p + 1) m_factors = factorize(m) divisors = generate_divisors(m_factors) for d in divisors: fd, fd1 = fast_doubling_pair(d, p) if fd == 0 and fd1 == 1: return d return m def get_tau_factors(tau, m_factors): tau_factors = {} for p in m_factors: e = 0 while tau % p == 0: e += 1 tau = tau // p if e > 0: tau_factors[p] = e if tau != 1: pass return tau_factors def main(): input = sys.stdin.read().split() ptr = 0 n = int(input[ptr]) ptr += 1 lcm_factors = {} for _ in range(n): p = int(input[ptr]) k = int(input[ptr+1]) ptr +=2 if p == 2: if k == 1: current_factors = {3:1} elif k == 2: current_factors = {2:1, 3:1} else: current_factors = {2: (k-1), 3:1} elif p ==5: current_factors = {2:2, 5:k} else: mod5 = p %5 if mod5 in (1,4): m_base = p-1 else: m_base = 2*(p+1) m_factors = factorize(m_base) tau_p = compute_tau(p) tau_factors = get_tau_factors(tau_p, m_factors) current_factors = tau_factors.copy() if p in current_factors: current_factors[p] += (k-1) else: current_factors[p] = (k-1) for prime, exp in current_factors.items(): if prime in lcm_factors: if exp > lcm_factors[prime]: lcm_factors[prime] = exp else: lcm_factors[prime] = exp result = 1 for prime, exp in lcm_factors.items(): result = (result * pow(prime, exp, MOD)) % MOD print(result) if __name__ == "__main__": main()