結果
| 問題 |
No.2262 Fractions
|
| コンテスト | |
| ユーザー |
とりゐ
|
| 提出日時 | 2023-04-07 20:49:14 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 572 ms / 2,000 ms |
| コード長 | 1,551 bytes |
| コンパイル時間 | 515 ms |
| コンパイル使用メモリ | 82,304 KB |
| 実行使用メモリ | 117,052 KB |
| 最終ジャッジ日時 | 2024-11-27 02:04:10 |
| 合計ジャッジ時間 | 22,503 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 45 |
ソースコード
def stern_brocot_tree_search(max_val):
lower=(1,1)
upper=(0,1)
now=(1,1)
while True:
now=(lower[0]+upper[0],lower[1]+upper[1])
now_judge=judge_function(now)
if now_judge:
frm=lower
to=upper
else:
frm=upper
to=lower
L=1
R=2
while judge_function((frm[0]+R*to[0],frm[1]+R*to[1]))==now_judge:
L*=2
R*=2
if frm[0]+L*to[0]>max_val or frm[1]+L*to[1]>max_val:
return to
while L+1<R:
mid=(L+R)//2
if judge_function((frm[0]+mid*to[0],frm[1]+mid*to[1]))==now_judge and frm[0]+mid*to[0]<=max_val and frm[1]+mid*to[1]<=max_val:
L=mid
else:
R=mid
if now_judge:
lower=(frm[0]+L*to[0],frm[1]+L*to[1])
else:
upper=(frm[0]+L*to[0],frm[1]+L*to[1])
M=3*10**5+100
sieve=[0]*2+[1]*M
primes=[]
for p in range(2,M):
if sieve[p]:
primes.append(p)
for i in range(2*p,M,p):
sieve[i]=0
def judge_function(res):
p,q=res
if count(n,p,q)>=k:
return True
return False
def count(n,P,Q):
dp=[0]*(n+1)
for i in range(1,n+1):
dp[i]=(P*i)//Q
for p in primes:
if p>n:
return sum(dp)
for i in range(n//p,0,-1):
dp[i*p]-=dp[i]
for _ in range(int(input())):
n,k=map(int,input().split())
c=count(n,n-1,n)
if k==c+1:
print('1/1')
continue
if k<=c:
rev=False
elif k<=2*c+1:
rev=True
k=2*c+2-k
else:
print(-1)
continue
ans=stern_brocot_tree_search(n)
num,den=ans
if rev:
den,num=num,den
print(str(num)+'/'+str(den))
とりゐ