結果
| 問題 |
No.3038 シャッフルの再現
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 18:50:40 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 3,486 bytes |
| コンパイル時間 | 220 ms |
| コンパイル使用メモリ | 82,396 KB |
| 実行使用メモリ | 68,140 KB |
| 最終ジャッジ日時 | 2025-06-12 18:50:49 |
| 合計ジャッジ時間 | 2,547 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| 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()
gew1fw