結果
問題 | No.2262 Fractions |
ユーザー |
|
提出日時 | 2023-04-07 23:34:33 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 792 ms / 2,000 ms |
コード長 | 5,545 bytes |
コンパイル時間 | 293 ms |
コンパイル使用メモリ | 82,048 KB |
実行使用メモリ | 92,472 KB |
最終ジャッジ日時 | 2024-11-27 02:08:38 |
合計ジャッジ時間 | 19,120 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 45 |
ソースコード
import sys,random,bisectfrom collections import deque,defaultdictfrom heapq import heapify,heappop,heappushfrom itertools import permutationsfrom math import gcd,loginput = lambda :sys.stdin.readline().rstrip()mi = lambda :map(int,input().split())li = lambda :list(mi())from collections import dequeclass Dinic:def __init__(self, N):self.N = Nself.G = [[] for i in range(N)]def add_edge(self, fr, to, cap):forward = [to, cap, None]forward[2] = backward = [fr, 0, forward]self.G[fr].append(forward)self.G[to].append(backward)def add_multi_edge(self, v1, v2, cap1, cap2):edge1 = [v2, cap1, None]edge1[2] = edge2 = [v1, cap2, edge1]self.G[v1].append(edge1)self.G[v2].append(edge2)def bfs(self, s, t):self.level = level = [None]*self.Ndeq = deque([s])level[s] = 0G = self.Gwhile deq:v = deq.popleft()lv = level[v] + 1for w, cap, _ in G[v]:if cap and level[w] is None:level[w] = lvdeq.append(w)return level[t] is not Nonedef dfs(self, v, t, f):if v == t:return flevel = self.levelfor e in self.it[v]:w, cap, rev = eif cap and level[v] < level[w]:d = self.dfs(w, t, min(f, cap))if d:e[1] -= drev[1] += dreturn dreturn 0def flow(self, s, t):flow = 0INF = 10**9 + 7G = self.Gwhile self.bfs(s, t):*self.it, = map(iter, self.G)f = INFwhile f:f = self.dfs(s, t, INF)flow += freturn flowdef floor_sum(n: int, m: int, a: int, b: int) -> int:ans = 0if a >= m:ans += (n - 1) * n * (a // m) // 2a %= mif b >= m:ans += n * (b // m)b %= my_max = (a * n + b) // mx_max = y_max * m - bif y_max == 0:return ansans += (n - (x_max + a - 1) // a) * y_maxans += floor_sum(y_max, a, m, (a - x_max % a) % a)return ansM = 3*10**5 + 1mebius = [1] * (M+1)prime = [True] * (M+1)for p in range(2,M+1):if not prime[p]:continuefor n in range(p,M+1,p):if n%(p*p) == 0:mebius[n] = 0mebius[n] *= -1prime[n] = Falsemebius_cum = [mebius[n] for n in range(M+1)]mebius[0] = 0for n in range(1,M):mebius_cum[n+1] += mebius_cum[n]def solve(N,K):lower = (0,1)upper = (1,0)calc = 0def cond(p,q):nonlocal calccalc += 1#assert p <= N and q <= N"""・qx<=py・1 <= x,y <= N・gcd(x,y)=1をみたすx,yを数えるgcd(x,y)がkの倍数とするとsum((N//k)-(qi)//p for i in range(1,(N//k)+1))-> floor_sum+メビウス変換"""res = 0B = int(N**.5)for k in range(1,B+1):t = N//ktmp = 0ok = -1ng = twhile ng-ok>1:mid = (ok+ng)//2if (q*mid+q-1)//p <= t:ok = midelse:ng = midtmp = t * ng - floor_sum(ng,p,q,q-1)res += tmp * mebius[k]for t in range(1,N//(B+1)+1):k_l = N//(t+1)+1k_r = N//ttmp = 0ok = -1ng = twhile ng-ok>1:mid = (ok+ng)//2if (q*mid+q-1)//p <= t:ok = midelse:ng = midtmp = t * ng - floor_sum(ng,p,q,q-1)res += tmp * (mebius_cum[k_r] - mebius_cum[k_l-1])return resif cond(N,1) < K:print(-1)returnwhile True:a,b = lowerc,d = upperp,q = (a+c,b+d)check = cond(p,q)if check < K:"""右に潜る"""ok = 1if d!=0:ng = min((N-b)//d,(N-a)//c) + 1else:ng = (N-a)//c + 1while ng-ok>1:mid = (ok+ng)//2p,q = a+c*mid,b+d*midxxx = cond(p,q)if xxx < K:ok = midelif K < xxx:ng = midelse:p,q = a+c*mid,b+d*midprint("{}/{}".format(p,q))returnlower = (a+c*ok,b+d*ok)elif K < check:"""左に潜る"""ok = 1if a!=0:ng = min((N-d)//b,(N-c)//a) + 1else:ng = (N-d)//b + 1while ng-ok>1:mid = (ok+ng)//2p,q = a*mid+c,b*mid+dif cond(p,q) > K:ok = midelse:ng = midupper = (a*ok+c,b*ok+d)else:print("{}/{}".format(p,q))returnfor _ in range(int(input())):N,K = mi()solve(N,K)