from ACL1 ACL1B B - Sum is Multiple
m = max([p ** f[p] for p in f])を得るk = -1 * inv_mod(m, r) * mで良いからdef solve(N):
from math import gcd
if N == 1:
return 1
ret = N - 1
for n in all_divisor(2 * N, includeN=False):
m = (2 * N) // n
if gcd(m, n) != 1:
continue
k = crt(0, n, -1, m)
if k < ret:
ret = k
return ret
def solve(N):
if N == 1:
return 1
factors = factor(2 * N)
num_factors = len(factors)
if num_factors == 1:
return N - 1
factors = [p ** factors[p] for p in factors]
ret = N - 1
for i in range(2 ** num_factors - 1):
prod = 1
j = 0
while i:
if i & 1:
prod *= factors[j]
j += 1
i >>= 1
rest = (2 * N) // prod
k = (-pow(prod, -1, rest) * prod) % (2 * N)
if k < ret:
ret = k
return ret
- うーむ [AC 21 TLE 21](https://atcoder.jp/contests/acl1/submissions/17258486)
- 素因数分解が遅いのか、束ね直すところが遅いのか
- [素因数分解を O(n^(1/4)) でする](/ja/%E7%B4%A0%E5%9B%A0%E6%95%B0%E5%88%86%E8%A7%A3%E3%82%92%20O(n%5E(1%2F4))%20%E3%81%A7%E3%81%99%E3%82%8B)に置き換えたら通った [51msec](https://atcoder.jp/contests/acl1/submissions/17259156)
- あとpowが[mod Pでの逆元](/ja/mod%20P%E3%81%A7%E3%81%AE%E9%80%86%E5%85%83)を求められるのはPython3.8からの割と新しい機能なのでPyPyでは動かなかった
- `ValueError: pow() 2nd argument cannot be negative when 3rd argument specified`