結果

問題 No.2882 Comeback
ユーザー Iroha_3856Iroha_3856
提出日時 2024-08-30 01:14:09
言語 PyPy3
(7.3.15)
結果
RE  
実行時間 -
コード長 1,549 bytes
コンパイル時間 375 ms
コンパイル使用メモリ 82,572 KB
実行使用メモリ 67,380 KB
最終ジャッジ日時 2024-08-30 01:14:28
合計ジャッジ時間 3,447 ms
ジャッジサーバーID
(参考情報)
judge5 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample RE * 1
other RE * 30
権限があれば一括ダウンロードができます

ソースコード

diff #

def solve():
    import sys
    input = sys.stdin.read
    data = input().split()
    
    A = int(data[0])
    B = int(data[1])
    
    # 変化する点を記録するリスト
    change = set()
    
    # A に対する変化する点
    d = 1
    while d * d <= A:
        change.add(d)
        change.add(A // d)
        d += 1
    
    # B に対する変化する点
    d = 1
    while d * d <= B:
        change.add(d)
        change.add(B // d)
        d += 1
    
    # 降順にソート
    change = sorted(change, reverse=True)
    
    # 重複削除済みの変化点リストに0を追加
    change.append(0)
    
    ans = 0
    N = len(change)
    
    for i in range(N - 1):
        # 初項
        fa = A % change[i]
        fb = B % change[i]
        # 公差
        da = A // change[i]
        db = B // change[i]
        # 打ち切り限界
        length = change[i] - change[i + 1]
        
        # 一次式の不等式を解く
        if da == db:
            if fa >= fb:
                ans += length
            continue
        
        if fa - fb < 0:
            continue
        
        x = (fa - fb) // (db - da)
        # 打ち切り
        if x >= length:
            x = length - 1
        # 0-indexedだったので、+1して数える
        ans += x + 1
    
    print(ans)

def main():
    import sys
    input = sys.stdin.read
    data = input().split()
    
    T = int(data[0])
    index = 1
    for _ in range(T):
        solve()
        index += 2

if __name__ == "__main__":
    main()
0