結果
| 問題 |
No.2262 Fractions
|
| コンテスト | |
| ユーザー |
とりゐ
|
| 提出日時 | 2023-03-09 11:05:06 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,007 ms / 2,000 ms |
| コード長 | 5,233 bytes |
| コンパイル時間 | 421 ms |
| コンパイル使用メモリ | 82,248 KB |
| 実行使用メモリ | 139,844 KB |
| 最終ジャッジ日時 | 2024-11-27 02:00:15 |
| 合計ジャッジ時間 | 30,203 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 45 |
ソースコード
from math import gcd
class Fraction:
def __init__(self, num, den=1):
if type(num) == float or type(num) == str:
assert den == 1
if type(num) == float:
S = str("{:.10f}".format(num))
else:
S = num
N = len(S)
point = -1
for i in range(N):
if S[i] == ".":
point = i
if point != -1:
F = Fraction(int(S[:point] + S[point + 1 :]), 10 ** (N - 1 - point))
else:
F = Fraction(int(S), 1)
self.num = F.num
self.den = F.den
elif type(num) == type(den) == int:
assert den != 0
"""
inf = 10**9
if den == 0:
if num > 0:
self.num = inf
self.den = 1
elif num < 0:
self.num = -inf
self.den = 1
else:
raise Exception
return
"""
den, num = max((den, num), (-den, -num))
g = gcd(den, num)
self.num = num // g
self.den = den // g
else:
raise Exception
def __str__(self):
return str(self.num) + "/" + str(self.den)
def __pos__(self):
return self
def __neg__(self):
num, den = self.num, self.den
return Fraction(-num, den)
def __add__(self, other):
if type(other) != Fraction:
other = Fraction(other)
num1, den1 = self.num, self.den
num2, den2 = other.num, other.den
return Fraction(num1 * den2 + num2 * den1, den1 * den2)
def __sub__(self, other):
if type(other) != Fraction:
other = Fraction(other)
num1, den1 = self.num, self.den
num2, den2 = other.num, other.den
return Fraction(num1 * den2 - num2 * den1, den1 * den2)
def __mul__(self, other):
if type(other) != Fraction:
other = Fraction(other)
num1, den1 = self.num, self.den
num2, den2 = other.num, other.den
return Fraction(num1 * num2, den1 * den2)
def __truediv__(self, other):
if type(other) != Fraction:
other = Fraction(other)
num1, den1 = self.num, self.den
num2, den2 = other.num, other.den
return Fraction(num1 * den2, num2 * den1)
def __pow__(self, x):
assert type(x) == int
num, den = self.num, self.den
if x >= 0:
return Fraction(num**x, den**x)
else:
return Fraction(den ** (-x), num ** (-x))
__radd__ = __add__
def __rsub__(self, other):
if type(other) != Fraction:
other = Fraction(other)
num1, den1 = other.num, other.den
num2, den2 = self.num, self.den
return Fraction(num1 * den2 - num2 * den1, den1 * den2)
__rmul__ = __mul__
def __rtruediv__(self, other):
if type(other) != Fraction:
other = Fraction(other)
num1, den1 = other.num, other.den
num2, den2 = self.num, self.den
return Fraction(num1 * den2, num2 * den1)
def __eq__(self, other):
if type(other) != Fraction:
other = Fraction(other)
num1, den1 = self.num, self.den
num2, den2 = other.num, other.den
return num1 == num2 and den1 == den2
def __lt__(self, other):
if type(other) != Fraction:
other = Fraction(other)
num1, den1 = self.num, self.den
num2, den2 = other.num, other.den
return num1 * den2 < num2 * den1
def __le__(self, other):
if type(other) != Fraction:
other = Fraction(other)
num1, den1 = self.num, self.den
num2, den2 = other.num, other.den
return num1 * den2 <= num2 * den1
def __gt__(self, other):
if type(other) != Fraction:
other = Fraction(other)
num1, den1 = self.num, self.den
num2, den2 = other.num, other.den
return num1 * den2 > num2 * den1
def __ge__(self, other):
if type(other) != Fraction:
other = Fraction(other)
num1, den1 = self.num, self.den
num2, den2 = other.num, other.den
return num1 * den2 >= num2 * den1
def floor(self):
return self.num//self.den
from sys import stdin
input=lambda :stdin.readline()[:-1]
def calc(n,a):
dp=[0]*(n+1)
for i in range(1,n+1):
s=(a*i)//n
dp[i]+=s
if dp[i]==0:
continue
for j in range(2*i,n+1,i):
dp[j]-=dp[i]
return sum(dp)
def solve():
n,k=map(int,input().split())
c=calc(n,n-1)
if k==c+1:
print('1/1')
return
if k<=c:
rev=False
elif k<=2*c+1:
rev=True
k=2*c+2-k
else:
print(-1)
return
ng,ok=n,0
while abs(ok-ng)>1:
mid=(ok+ng)//2
if calc(n,mid)<=k:
ok=mid
else:
ng=mid
k-=calc(n,ok)
fracs=[]
for p in range(1,n+1):
q=(ok*p+n-1)//n
if q*n<(ok+1)*p:
if gcd(p,q)==1:
fracs.append(Fraction(q,p))
fracs.sort()
if rev:
print(1/fracs[k])
else:
print(fracs[k])
for _ in range(int(input())):
solve()
とりゐ