結果
| 問題 | 
                            No.2066 Simple Math !
                             | 
                    
| コンテスト | |
| ユーザー | 
                             | 
                    
| 提出日時 | 2022-09-02 23:21:00 | 
| 言語 | PyPy3  (7.3.15)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 891 ms / 2,000 ms | 
| コード長 | 1,389 bytes | 
| コンパイル時間 | 939 ms | 
| コンパイル使用メモリ | 82,292 KB | 
| 実行使用メモリ | 80,092 KB | 
| 最終ジャッジ日時 | 2024-11-16 06:20:50 | 
| 合計ジャッジ時間 | 21,448 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge1 / judge2 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 1 | 
| other | AC * 31 | 
ソースコード
import sys
input = lambda :sys.stdin.readline()[:-1]
ni = lambda :int(input())
na = lambda :list(map(int,input().split()))
yes = lambda :print("yes");Yes = lambda :print("Yes");YES = lambda : print("YES")
no = lambda :print("no");No = lambda :print("No");NO = lambda : print("NO")
#######################################################################
def floor_sum(n, m, a, b):
    ans = 0
    # 領域①
    if a >= m:
        ans += (n - 1) * n * (a // m) // 2
        a %= m
    # 領域②
    if b >= m:
        ans += n * (b // m)
        b %= m
 
    y_max = (a * n + b) // m
    x_max = y_max * m - b
    if y_max == 0: return ans
 
    # 領域③
    ans += (n - (x_max + a - 1) // a) * y_max
 
    # 領域④
    ans += floor_sum(y_max, a, m, (-x_max) % a)
    # ACLでは負数の剰余に注意して以下のように書かれている
    # ans += floor_sum(y_max, a, m, (a - x_max % a) % a) 
 
    return ans
def f(n):
    if n <= g * (P-1) * (Q-1):
        F = n//p + 1
        return floor_sum(F,q, p,n - (F-1) * p) + F
    else:
        return f(g * (P-1)*(Q-1)) + (n//g-(P-1)*(Q-1))
t = ni()
from math import gcd
for _ in range(t):
    p, q, k = na()
    k += 1
    g = gcd(p, q)
    P, Q = p//g, q//g
    ng = -1
    ok = 10**18
    while ok-ng > 1:
        d = (ok+ng)//2
        if f(d) >= k:
            ok = d
        else:
            ng = d
    print(ok)