結果

問題 No.2882 Comeback
ユーザー hiro1729hiro1729
提出日時 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
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 38 ms
53,144 KB
testcase_01 AC 40 ms
53,336 KB
testcase_02 AC 40 ms
53,396 KB
testcase_03 AC 40 ms
54,068 KB
testcase_04 AC 38 ms
53,392 KB
testcase_05 AC 60 ms
68,576 KB
testcase_06 AC 61 ms
69,480 KB
testcase_07 AC 64 ms
70,592 KB
testcase_08 AC 61 ms
68,096 KB
testcase_09 AC 61 ms
69,136 KB
testcase_10 AC 231 ms
127,816 KB
testcase_11 AC 202 ms
124,096 KB
testcase_12 AC 239 ms
129,308 KB
testcase_13 AC 241 ms
134,156 KB
testcase_14 AC 203 ms
122,772 KB
testcase_15 AC 252 ms
132,772 KB
testcase_16 AC 212 ms
126,744 KB
testcase_17 AC 216 ms
126,060 KB
testcase_18 AC 261 ms
137,656 KB
testcase_19 AC 230 ms
127,588 KB
testcase_20 AC 276 ms
143,948 KB
testcase_21 AC 264 ms
142,544 KB
testcase_22 AC 265 ms
138,168 KB
testcase_23 AC 276 ms
143,088 KB
testcase_24 AC 228 ms
148,504 KB
testcase_25 AC 39 ms
52,204 KB
testcase_26 AC 39 ms
53,528 KB
testcase_27 AC 39 ms
53,260 KB
testcase_28 AC 38 ms
53,956 KB
testcase_29 AC 38 ms
53,776 KB
testcase_30 AC 70 ms
76,496 KB
権限があれば一括ダウンロードができます

ソースコード

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