結果
問題 | No.1200 お菓子配り-3 |
ユーザー |
![]() |
提出日時 | 2020-08-28 22:39:59 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 3,030 bytes |
コンパイル時間 | 416 ms |
コンパイル使用メモリ | 82,428 KB |
実行使用メモリ | 80,208 KB |
最終ジャッジ日時 | 2024-11-14 16:08:24 |
合計ジャッジ時間 | 6,461 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 29 WA * 2 |
ソースコード
import sysinput = sys.stdin.buffer.readlinedef gcd(a, b):while b: a, b = b, a % breturn adef isPrimeMR(n):d = n - 1d = d // (d & -d)L = [2]for a in L:t = dy = pow(a, t, n)if y == 1: continuewhile y != n - 1:y = (y * y) % nif y == 1 or t == n - 1: return 0t <<= 1return 1def findFactorRho(n):m = 1 << n.bit_length() // 8for c in range(1, 99):f = lambda x: (x * x + c) % ny, r, q, g = 2, 1, 1, 1while g == 1:x = yfor i in range(r):y = f(y)k = 0while k < r and g == 1:ys = yfor i in range(min(m, r - k)):y = f(y)q = q * abs(x - y) % ng = gcd(q, n)k += mr <<= 1if g == n:g = 1while g == 1:ys = f(ys)g = gcd(abs(x - ys), n)if g < n:if isPrimeMR(g): return gelif isPrimeMR(n // g): return n // greturn findFactorRho(g)def primeFactor(n):i = 2ret = {}rhoFlg = 0while i*i <= n:k = 0while n % i == 0:n //= ik += 1if k: ret[i] = ki += 1 + i % 2if i == 101 and n >= 2 ** 20:while n > 1:if isPrimeMR(n):ret[n], n = 1, 1else:rhoFlg = 1j = findFactorRho(n)k = 0while n % j == 0:n //= jk += 1ret[j] = kif n > 1: ret[n] = 1if rhoFlg: ret = {x: ret[x] for x in sorted(ret)}return retdef make_divisors(n):def solve(li, ind, val):if ind == len(li):res.append(val)returnfor v in li[ind]:solve(li, ind + 1, val * v)factors = primeFactor(n)li = []for v in factors:tmp = [1]val = vfor _ in range(factors[val]):tmp.append(val)val *= vli.append(tmp)res = []solve(li, 0, 1)return ress = int(input())memo = {}for _ in range(s):x, y = map(int, input().split())if x < y:x, y = y, xsum_ = x + ydiff = x - ycnt = 0if diff == 0:cnt += x - 1# b * (a + 1) = xcnt += (len(make_divisors(x)) - 1)print(cnt)continuefor div in make_divisors(diff):a = div + 1# b + c = sum_ // (a + 1)# b - c = diff // (a - 1)if sum_ % (a + 1) != 0:continuet1, t2 = sum_ // (a + 1), diff // (a - 1)if (t1 + t2) % 2 == 1:continueb, c = (t1 + t2) // 2, (t1 - t2) // 2if b > 0 and c > 0:cnt += 1print(cnt)