結果
問題 |
No.3038 シャッフルの再現
|
ユーザー |
![]() |
提出日時 | 2025-04-16 16:22:11 |
言語 | PyPy3 (7.3.15) |
結果 |
RE
|
実行時間 | - |
コード長 | 2,694 bytes |
コンパイル時間 | 216 ms |
コンパイル使用メモリ | 81,708 KB |
実行使用メモリ | 67,244 KB |
最終ジャッジ日時 | 2025-04-16 16:23:24 |
合計ジャッジ時間 | 2,248 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | RE * 1 |
other | RE * 21 |
ソースコード
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_sorted(factors): divisors = [1] for p in sorted(factors.keys()): exp = factors[p] current_powers = [p**e for e in range(exp + 1)] new_divisors = [] for d in divisors: for power in current_powers: new_divisors.append(d * power) divisors = sorted(list(set(new_divisors))) return divisors def fast_doubling(n, mod): if n == 0: return (0, 1) a, b = fast_doubling(n >> 1, mod) c = (a * (2 * b - a)) % mod d = (a * a + b * b) % mod if n & 1: return (d, (c + d) % mod) else: return (c, d) def compute_pisano_prime(p): if p == 2: return 3 if p == 5: return 20 legendre = pow(5, (p - 1) // 2, p) if legendre == 1 or legendre == 0: candidate = p - 1 else: candidate = 2 * (p + 1) factors = factorize(candidate) divisors = generate_divisors_sorted(factors) for d in divisors: if d == 0: continue f_d, f_d_plus_1 = fast_doubling(d, p) if f_d % p == 0 and f_d_plus_1 % p == 1: return d return candidate def get_pisano_power_factors(p, k): if p == 2: if k == 1: return {3: 1} elif k == 2: return {2: 1, 3: 1} else: return {2: (k - 1), 3: 1} elif p == 5: return {2: 2, 5: k} else: pisano_p = compute_pisano_prime(p) factors = factorize(pisano_p) factors[p] = factors.get(p, 0) + (k - 1) return factors def main(): import sys input = sys.stdin.read().split() idx = 0 while idx < len(input): N = int(input[idx]) idx += 1 lcm_factors = {} for _ in range(N): p = int(input[idx]) k = int(input[idx + 1]) idx += 2 factors = get_pisano_power_factors(p, k) for prime, exp in 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 sorted(lcm_factors.items()): result = (result * pow(prime, exp, MOD)) % MOD print(result) if __name__ == "__main__": main()