結果

問題 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
権限があれば一括ダウンロードができます

ソースコード

diff #

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))
0