結果

問題 No.2882 Comeback
ユーザー hiro1729
提出日時 2024-09-07 13:39:32
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 276 ms / 2,000 ms
コード長 1,214 bytes
コンパイル時間 329 ms
コンパイル使用メモリ 82,624 KB
実行使用メモリ 148,504 KB
最終ジャッジ日時 2024-09-07 13:39:38
合計ジャッジ時間 5,953 ms
ジャッジサーバーID
(参考情報)
judge2 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 30
権限があれば一括ダウンロードができます

ソースコード

diff #

from math import isqrt

for _ in range(int(input())):
	A, B = map(int, input().split())
	change = set() # 変化する点を記録する (重複削除のためset)
	for d in range(1, isqrt(A) + 1):
		change.add(d)
		change.add(A // d)
	for d in range(1, isqrt(B) + 1):
		change.add(d)
		change.add(B // d)
	change = list(change)
	change.sort(reverse = True) # 降順ソート
	N = len(change)
	change.append(0) # 番兵
	ans = 0
	for i in range(N):
		fa, fb = A % change[i], B % change[i] # 初項
		da, db = A // change[i], B // change[i] # 公差
		l = change[i] - change[i + 1] # 打ち切り限界

		# 一次式の不等式を解く
		# x項目(0-indexed)について、
		# fa + da*x >= fb + db * x
		# (da-db)x >= fb-fa
		# x <= (fb-fa)/(da-db) (B > A より、da >= db)
		# x <= (fa-fb)/(db-da) (db-daで割ることによって、正整数の除算にする)

		# ゼロ除算を防止
		if da == db:
			if fa >= fb:
				ans += l # 逆転せず A >= B が続く
			continue
		# 答えが負になるので、初めから負けているから、足さない
		if fa < fb:
			continue
		x = (fa - fb) // (db - da)
		# 0-indexed で +1 するのと、打ち切るので min
		ans += min(l, x + 1)
	print(ans)
0