結果
| 問題 |
No.2066 Simple Math !
|
| コンテスト | |
| ユーザー |
👑 Kazun
|
| 提出日時 | 2022-09-02 22:51:11 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,020 bytes |
| コンパイル時間 | 458 ms |
| コンパイル使用メモリ | 82,344 KB |
| 実行使用メモリ | 161,228 KB |
| 最終ジャッジ日時 | 2024-11-16 05:22:14 |
| 合計ジャッジ時間 | 60,220 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 16 TLE * 15 |
ソースコード
def floor_sum(A,B,M,N):
"""sum_{i=0}^{N-1} floor((A*i+B)/M) を求める.
"""
T=0
while True:
T+=((N-1)*N//2)*(A//M)
A%=M
T+=N*(B//M)
B%=M
y=(A*N+B)//M
x=B-y*M
if y==0:
return T
T+=(N+x//A)*y
A,B,M,N=M,x%A,A,y
def Floor_Sum(A:int,B:int,M:int,N:int,K=0):
"""sum_{i=K}^N floor((A*i+B)/M) を求める.
"""
if K==0:
return floor_sum(A,B,M,N+1)
else:
return floor_sum(A,B,M,N+1)-floor_sum(A,B,M,K)
def Extend_Euclid(a:int,b:int):
"""gcd(a,b) と ax+by=gcd(a,b) を満たす整数 x,y の例を挙げる.
[Input]
a,b: 整数
[Output]
(x,y,gcd(a,b))
"""
s,t,u,v=1,0,0,1
while b:
q,a,b=a//b,b,a%b
s,t=t,s-q*t
u,v=v,u-q*v
return s,u,a
def General_Binary_Increase_Search_Integer(L, R, cond, default=None):
""" 条件式が単調増加であるとき, 整数上で二部探索を行う.
L: 解の下限
R: 解の上限
cond: 条件(1変数関数, 広義単調増加を満たす)
default: Lで条件を満たさないときの返り値
"""
if not(cond(R)):
return default
if cond(L):
return L
R+=1
while R-L>1:
C=L+(R-L)//2
if cond(C):
R=C
else:
L=C
return R
#==================================================
def solve(P,Q,K):
a,b,g=Extend_Euclid(P,Q)
if g>=2:
return g*solve(P//g, Q//g, K)
if P==1 or Q==1:
return K
def calc(n):
X=Floor_Sum(b,0,P,n,1)
Y=Floor_Sum(-a,-1,Q,n,0)
return X-Y
L=calc((P-1)*(Q-1))
if L>K:
return General_Binary_Increase_Search_Integer(0,(P-1)*(Q-1), lambda n:calc(n)>K)
else:
return (P-1)*(Q-1)+(K-L)+1
import sys
input=sys.stdin.readline
write=sys.stdout.write
T=int(input())
Ans=[0]*T
for t in range(T):
P,Q,K=map(int,input().split())
Ans[t]=solve(P,Q,K)
write("\n".join(map(str,Ans)))
Kazun