#define PROBLEM "https://yukicoder.me/problems/no/2262"
//#include"../../template/template.hpp"//#include"../../atcoder/math.hpp"
#include"../../math/stern-brocot-tree-binary-search.hpp"//#include"../../math/rational.hpp"//#include"../../multiplicative-function/enumerate-sum-of-multiplicative-function.hpp"usingnamespaceNyaan;usingSBT=SternBrocotTreeNode<ll>;// k 番目に小さいplcalc(llN,llK){autosg=[](intn)->int{returnn;};autosh=[](int)->int{return1;};enumerate_mf_prefix_sum<int,decltype(sg),decltype(sh)>moe(N,sg,sh);autocnt=[&](Rationalf)->ll{lls=0;enumerate_quotient(N,[&](llq,lll,llr){llx=0;x+=atcoder::floor_sum(r+1,f.y,f.x,0);x-=atcoder::floor_sum(l+1,f.y,f.x,0);s+=x*moe(q);});returns;};autojudge=[&](pair<ll,ll>f)->bool{returncnt({f.first,f.second})>=K;};autoans=binary_search_on_stern_brocot_tree<ll>(judge,N).second;return{ans.first,ans.second};}voidq(){inl(N,K);autog=[](lln)->ll{returnn;};autoh=[](lln)->ll{returnn*(n+1)/2;};enumerate_mf_prefix_sum<ll,decltype(g),decltype(h)>tot(N,g,h);lls=tot(N)-1;trc(s);llp=-1,q=-1;if(K<=s){tie(p,q)=calc(N,K);}elseif(K==s+1){p=q=1;}elseif(K<=s*2+1){tie(q,p)=calc(N,2*s+1-(K-1));}else{// do nothing}if(p==-1){out(-1);}else{cout<<p<<"/"<<q<<"\n";}}voidNyaan::solve(){intt=1;in(t);while(t--)q();}
#line 1 "verify/verify-yuki/yuki-2262.test.cpp"
#define PROBLEM "https://yukicoder.me/problems/no/2262"
//#line 2 "template/template.hpp"
usingnamespacestd;// intrinstic#include<immintrin.h>#include<algorithm>
#include<array>
#include<bitset>
#include<cassert>
#include<cctype>
#include<cfenv>
#include<cfloat>
#include<chrono>
#include<cinttypes>
#include<climits>
#include<cmath>
#include<complex>
#include<cstdarg>
#include<cstddef>
#include<cstdint>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<deque>
#include<fstream>
#include<functional>
#include<initializer_list>
#include<iomanip>
#include<ios>
#include<iostream>
#include<istream>
#include<iterator>
#include<limits>
#include<list>
#include<map>
#include<memory>
#include<new>
#include<numeric>
#include<ostream>
#include<queue>
#include<random>
#include<set>
#include<sstream>
#include<stack>
#include<streambuf>
#include<string>
#include<tuple>
#include<type_traits>
#include<typeinfo>
#include<unordered_map>
#include<unordered_set>
#include<utility>
#include<vector>// utility#line 3 "template/util.hpp"
namespaceNyaan{usingll=longlong;usingi64=longlong;usingu64=unsignedlonglong;usingi128=__int128_t;usingu128=__uint128_t;template<typenameT>usingV=vector<T>;template<typenameT>usingVV=vector<vector<T>>;usingvi=vector<int>;usingvl=vector<longlong>;usingvd=V<double>;usingvs=V<string>;usingvvi=vector<vector<int>>;usingvvl=vector<vector<longlong>>;template<typenameT>usingminpq=priority_queue<T,vector<T>,greater<T>>;template<typenameT,typenameU>structP:pair<T,U>{template<typename...Args>P(Args...args):pair<T,U>(args...){}usingpair<T,U>::first;usingpair<T,U>::second;P&operator+=(constP&r){first+=r.first;second+=r.second;return*this;}P&operator-=(constP&r){first-=r.first;second-=r.second;return*this;}P&operator*=(constP&r){first*=r.first;second*=r.second;return*this;}template<typenameS>P&operator*=(constS&r){first*=r,second*=r;return*this;}Poperator+(constP&r)const{returnP(*this)+=r;}Poperator-(constP&r)const{returnP(*this)-=r;}Poperator*(constP&r)const{returnP(*this)*=r;}template<typenameS>Poperator*(constS&r)const{returnP(*this)*=r;}Poperator-()const{returnP{-first,-second};}};usingpl=P<ll,ll>;usingpi=P<int,int>;usingvp=V<pl>;constexprintinf=1001001001;constexprlonglonginfLL=4004004004004004004LL;template<typenameT>intsz(constT&t){returnt.size();}template<typenameT,typenameU>inlineboolamin(T&x,Uy){return(y<x)?(x=y,true):false;}template<typenameT,typenameU>inlineboolamax(T&x,Uy){return(x<y)?(x=y,true):false;}template<typenameT>inlineTMax(constvector<T>&v){return*max_element(begin(v),end(v));}template<typenameT>inlineTMin(constvector<T>&v){return*min_element(begin(v),end(v));}template<typenameT>inlinelonglongSum(constvector<T>&v){returnaccumulate(begin(v),end(v),0LL);}template<typenameT>intlb(constvector<T>&v,constT&a){returnlower_bound(begin(v),end(v),a)-begin(v);}template<typenameT>intub(constvector<T>&v,constT&a){returnupper_bound(begin(v),end(v),a)-begin(v);}constexprlonglongTEN(intn){longlongret=1,x=10;for(;n;x*=x,n>>=1)ret*=(n&1?x:1);returnret;}template<typenameT,typenameU>pair<T,U>mkp(constT&t,constU&u){returnmake_pair(t,u);}template<typenameT>vector<T>mkrui(constvector<T>&v,boolrev=false){vector<T>ret(v.size()+1);if(rev){for(inti=int(v.size())-1;i>=0;i--)ret[i]=v[i]+ret[i+1];}else{for(inti=0;i<int(v.size());i++)ret[i+1]=ret[i]+v[i];}returnret;};template<typenameT>vector<T>mkuni(constvector<T>&v){vector<T>ret(v);sort(ret.begin(),ret.end());ret.erase(unique(ret.begin(),ret.end()),ret.end());returnret;}template<typenameF>vector<int>mkord(intN,Ff){vector<int>ord(N);iota(begin(ord),end(ord),0);sort(begin(ord),end(ord),f);returnord;}template<typenameT>vector<int>mkinv(vector<T>&v){intmax_val=*max_element(begin(v),end(v));vector<int>inv(max_val+1,-1);for(inti=0;i<(int)v.size();i++)inv[v[i]]=i;returninv;}vector<int>mkiota(intn){vector<int>ret(n);iota(begin(ret),end(ret),0);returnret;}template<typenameT>Tmkrev(constT&v){Tw{v};reverse(begin(w),end(w));returnw;}template<typenameT>boolnxp(T&v){returnnext_permutation(begin(v),end(v));}// 返り値の型は入力の T に依存// i 要素目 : [0, a[i])template<typenameT>vector<vector<T>>product(constvector<T>&a){vector<vector<T>>ret;vector<T>v;autodfs=[&](autorc,inti)->void{if(i==(int)a.size()){ret.push_back(v);return;}for(intj=0;j<a[i];j++)v.push_back(j),rc(rc,i+1),v.pop_back();};dfs(dfs,0);returnret;}// F : void(T&), mod を取る操作// T : 整数型のときはオーバーフローに注意するtemplate<typenameT,typenameF>TPower(Ta,longlongn,constT&I,F&&f){static_assert(std::is_invocable_r_v<void,F&,T&>,"Power callback must be callable as void(T&)");Tres=I;for(;n;std::invoke(f,a=a*a),n>>=1){if(n&1)std::invoke(f,res=res*a);}returnres;}// T : 整数型のときはオーバーフローに注意するtemplate<typenameT>TPower(Ta,longlongn,constT&I=T{1}){autono_op=[](T&)->void{};returnPower(a,n,I,no_op);}template<typenameT>TRev(constT&v){Tres=v;reverse(begin(res),end(res));returnres;}template<typenameT>vector<T>Transpose(constvector<T>&v){usingU=typenameT::value_type;if(v.empty())return{};intH=v.size(),W=v[0].size();vectorres(W,T(H,U{}));for(inti=0;i<H;i++){for(intj=0;j<W;j++){res[j][i]=v[i][j];}}returnres;}template<typenameT>vector<T>Rotate(constvector<T>&v,intclockwise=true){usingU=typenameT::value_type;intH=v.size(),W=v[0].size();vectorres(W,T(H,U{}));for(inti=0;i<H;i++){for(intj=0;j<W;j++){if(clockwise){res[W-1-j][i]=v[i][j];}else{res[j][H-1-i]=v[i][j];}}}returnres;}}// namespace Nyaan#line 58 "template/template.hpp"
// bit operation#line 1 "template/bitop.hpp"
namespaceNyaan{__attribute__((target("popcnt")))inlineintpopcnt(constu64&a){return__builtin_popcountll(a);}inlineintlsb(constu64&a){returna?__builtin_ctzll(a):64;}inlineintctz(constu64&a){returna?__builtin_ctzll(a):64;}inlineintmsb(constu64&a){returna?63-__builtin_clzll(a):-1;}template<typenameT>inlineintgbit(constT&a,inti){return(a>>i)&1;}template<typenameT>inlinevoidsbit(T&a,inti,boolb){if(gbit(a,i)!=b)a^=T(1)<<i;}constexprlonglongPW(intn){return1LL<<n;}constexprlonglongMSK(intn){return(1LL<<n)-1;}}// namespace Nyaan#line 61 "template/template.hpp"
// inout#line 1 "template/inout.hpp"
namespaceNyaan{template<typenameT,typenameU>ostream&operator<<(ostream&os,constpair<T,U>&p){os<<p.first<<" "<<p.second;returnos;}template<typenameT,typenameU>istream&operator>>(istream&is,pair<T,U>&p){is>>p.first>>p.second;returnis;}template<typenameT>ostream&operator<<(ostream&os,constvector<T>&v){ints=(int)v.size();for(inti=0;i<s;i++)os<<(i?" ":"")<<v[i];returnos;}template<typenameT>istream&operator>>(istream&is,vector<T>&v){for(auto&x:v)is>>x;returnis;}istream&operator>>(istream&is,__int128_t&x){stringS;is>>S;x=0;intflag=0;for(auto&c:S){if(c=='-'){flag=true;continue;}x*=10;x+=c-'0';}if(flag)x=-x;returnis;}istream&operator>>(istream&is,__uint128_t&x){stringS;is>>S;x=0;for(auto&c:S){x*=10;x+=c-'0';}returnis;}ostream&operator<<(ostream&os,__int128_tx){if(x==0)returnos<<0;if(x<0)os<<'-',x=-x;stringS;while(x)S.push_back('0'+x%10),x/=10;reverse(begin(S),end(S));returnos<<S;}ostream&operator<<(ostream&os,__uint128_tx){if(x==0)returnos<<0;stringS;while(x)S.push_back('0'+x%10),x/=10;reverse(begin(S),end(S));returnos<<S;}voidin(){}template<typenameT,class...U>voidin(T&t,U&...u){cin>>t;in(u...);}voidout(){cout<<"\n";}template<typenameT,class...U,charsep=' '>voidout(constT&t,constU&...u){cout<<t;if(sizeof...(u))cout<<sep;out(u...);}structIoSetupNya{IoSetupNya(){cin.tie(nullptr);ios::sync_with_stdio(false);cout<<fixed<<setprecision(15);cerr<<fixed<<setprecision(7);}}iosetupnya;}// namespace Nyaan#line 64 "template/template.hpp"
// debug#line 1 "template/debug.hpp"
namespaceDebugImpl{template<typenameU,typename=void>structis_specialize:false_type{};template<typenameU>structis_specialize<U,typenameconditional<false,typenameU::iterator,void>::type>:true_type{};template<typenameU>structis_specialize<U,typenameconditional<false,decltype(U::first),void>::type>:true_type{};template<typenameU>structis_specialize<U,enable_if_t<is_integral<U>::value,void>>:true_type{};voiddump(constchar&t){cerr<<t;}voiddump(conststring&t){cerr<<t;}voiddump(constbool&t){cerr<<(t?"true":"false");}voiddump(__int128_tt){if(t==0)cerr<<0;if(t<0)cerr<<'-',t=-t;stringS;while(t)S.push_back('0'+t%10),t/=10;reverse(begin(S),end(S));cerr<<S;}voiddump(__uint128_tt){if(t==0)cerr<<0;stringS;while(t)S.push_back('0'+t%10),t/=10;reverse(begin(S),end(S));cerr<<S;}template<typenameU,enable_if_t<!is_specialize<U>::value,nullptr_t>=nullptr>voiddump(constU&t){cerr<<t;}template<typenameT>voiddump(constT&t,enable_if_t<is_integral<T>::value>*=nullptr){stringres;if(t==Nyaan::inf)res="inf";ifconstexpr(is_signed<T>::value){if(t==-Nyaan::inf)res="-inf";}ifconstexpr(sizeof(T)==8){if(t==Nyaan::infLL)res="inf";ifconstexpr(is_signed<T>::value){if(t==-Nyaan::infLL)res="-inf";}}if(res.empty())res=to_string(t);cerr<<res;}template<typenameT,typenameU>voiddump(constpair<T,U>&);template<typenameT>voiddump(constpair<T*,int>&);template<typenameT>voiddump(constT&t,enable_if_t<!is_void<typenameT::iterator>::value>*=nullptr){cerr<<"[ ";for(autoit=t.begin();it!=t.end();){dump(*it);cerr<<(++it==t.end()?"":", ");}cerr<<" ]";}template<typenameT,typenameU>voiddump(constpair<T,U>&t){cerr<<"( ";dump(t.first);cerr<<", ";dump(t.second);cerr<<" )";}template<typenameT>voiddump(constpair<T*,int>&t){cerr<<"[ ";for(inti=0;i<t.second;i++){dump(t.first[i]);cerr<<(i==t.second-1?"":", ");}cerr<<" ]";}voidtrace(){cerr<<endl;}template<typenameHead,typename...Tail>voidtrace(Head&&head,Tail&&...tail){cerr<<" ";dump(head);if(sizeof...(tail)!=0)cerr<<",";trace(std::forward<Tail>(tail)...);}}// namespace DebugImpl#ifdef NyaanDebug
#define trc(...) \
do { \
cerr << "## " << #__VA_ARGS__ << " = "; \
DebugImpl::trace(__VA_ARGS__); \
} while (0)
#else
#define trc(...) (void(0))
#endif
#ifdef NyaanLocal
#define trc2(...) \
do { \
cerr << "## " << #__VA_ARGS__ << " = "; \
DebugImpl::trace(__VA_ARGS__); \
} while (0)
#else
#define trc2(...) (void(0))
#endif
#line 67 "template/template.hpp"
// macro#line 1 "template/macro.hpp"
#define each(x, v) for (auto&& x : v)
#define each2(x, y, v) for (auto&& [x, y] : v)
#define all(v) (v).begin(), (v).end()
#define rep(i, N) for (long long i = 0; i < (long long)(N); i++)
#define repr(i, N) for (long long i = (long long)(N)-1; i >= 0; i--)
#define rep1(i, N) for (long long i = 1; i <= (long long)(N); i++)
#define repr1(i, N) for (long long i = (N); (long long)(i) > 0; i--)
#define reg(i, a, b) for (long long i = (a); i < (b); i++)
#define regr(i, a, b) for (long long i = (b)-1; i >= (a); i--)
#define fi first
#define se second
#define ini(...) \
int __VA_ARGS__; \
in(__VA_ARGS__)
#define inl(...) \
long long __VA_ARGS__; \
in(__VA_ARGS__)
#define ins(...) \
string __VA_ARGS__; \
in(__VA_ARGS__)
#define in2(s, t) \
for (int i = 0; i < (int)s.size(); i++) { \
in(s[i], t[i]); \
}
#define in3(s, t, u) \
for (int i = 0; i < (int)s.size(); i++) { \
in(s[i], t[i], u[i]); \
}
#define in4(s, t, u, v) \
for (int i = 0; i < (int)s.size(); i++) { \
in(s[i], t[i], u[i], v[i]); \
}
#define die(...) \
do { \
Nyaan::out(__VA_ARGS__); \
return; \
} while (0)
#line 70 "template/template.hpp"
namespaceNyaan{voidsolve();}intmain(){Nyaan::solve();}#line 4 "verify/verify-yuki/yuki-2262.test.cpp"
//#line 1 "atcoder/math.hpp"
#line 8 "atcoder/math.hpp"
#line 1 "atcoder/internal_math.hpp"
#line 5 "atcoder/internal_math.hpp"
#ifdef _MSC_VER
#include<intrin.h>
#endif
namespaceatcoder{namespaceinternal{// @param m `1 <= m`// @return x mod mconstexprlonglongsafe_mod(longlongx,longlongm){x%=m;if(x<0)x+=m;returnx;}// Fast modular multiplication by barrett reduction// Reference: https://en.wikipedia.org/wiki/Barrett_reduction// NOTE: reconsider after Ice Lakestructbarrett{unsignedint_m;unsignedlonglongim;// @param m `1 <= m`explicitbarrett(unsignedintm):_m(m),im((unsignedlonglong)(-1)/m+1){}// @return munsignedintumod()const{return_m;}// @param a `0 <= a < m`// @param b `0 <= b < m`// @return `a * b % m`unsignedintmul(unsignedinta,unsignedintb)const{// [1] m = 1// a = b = im = 0, so okay// [2] m >= 2// im = ceil(2^64 / m)// -> im * m = 2^64 + r (0 <= r < m)// let z = a*b = c*m + d (0 <= c, d < m)// a*b * im = (c*m + d) * im = c*(im*m) + d*im = c*2^64 + c*r + d*im// c*r + d*im < m * m + m * im < m * m + 2^64 + m <= 2^64 + m * (m + 1) < 2^64 * 2// ((ab * im) >> 64) == c or c + 1unsignedlonglongz=a;z*=b;#ifdef _MSC_VER
unsignedlonglongx;_umul128(z,im,&x);#else
unsignedlonglongx=(unsignedlonglong)(((unsigned__int128)(z)*im)>>64);#endif
unsignedlonglongy=x*_m;return(unsignedint)(z-y+(z<y?_m:0));}};// @param n `0 <= n`// @param m `1 <= m`// @return `(x ** n) % m`constexprlonglongpow_mod_constexpr(longlongx,longlongn,intm){if(m==1)return0;unsignedint_m=(unsignedint)(m);unsignedlonglongr=1;unsignedlonglongy=safe_mod(x,m);while(n){if(n&1)r=(r*y)%_m;y=(y*y)%_m;n>>=1;}returnr;}// Reference:// M. Forisek and J. Jancina,// Fast Primality Testing for Integers That Fit into a Machine Word// @param n `0 <= n`constexprboolis_prime_constexpr(intn){if(n<=1)returnfalse;if(n==2||n==7||n==61)returntrue;if(n%2==0)returnfalse;longlongd=n-1;while(d%2==0)d/=2;constexprlonglongbases[3]={2,7,61};for(longlonga:bases){longlongt=d;longlongy=pow_mod_constexpr(a,t,n);while(t!=n-1&&y!=1&&y!=n-1){y=y*y%n;t<<=1;}if(y!=n-1&&t%2==0){returnfalse;}}returntrue;}template<intn>constexprboolis_prime=is_prime_constexpr(n);// @param b `1 <= b`// @return pair(g, x) s.t. g = gcd(a, b), xa = g (mod b), 0 <= x < b/gconstexprstd::pair<longlong,longlong>inv_gcd(longlonga,longlongb){a=safe_mod(a,b);if(a==0)return{b,0};// Contracts:// [1] s - m0 * a = 0 (mod b)// [2] t - m1 * a = 0 (mod b)// [3] s * |m1| + t * |m0| <= blonglongs=b,t=a;longlongm0=0,m1=1;while(t){longlongu=s/t;s-=t*u;m0-=m1*u;// |m1 * u| <= |m1| * s <= b// [3]:// (s - t * u) * |m1| + t * |m0 - m1 * u|// <= s * |m1| - t * u * |m1| + t * (|m0| + |m1| * u)// = s * |m1| + t * |m0| <= bautotmp=s;s=t;t=tmp;tmp=m0;m0=m1;m1=tmp;}// by [3]: |m0| <= b/g// by g != b: |m0| < b/gif(m0<0)m0+=b/s;return{s,m0};}// Compile time primitive root// @param m must be prime// @return primitive root (and minimum in now)constexprintprimitive_root_constexpr(intm){if(m==2)return1;if(m==167772161)return3;if(m==469762049)return3;if(m==754974721)return11;if(m==998244353)return3;intdivs[20]={};divs[0]=2;intcnt=1;intx=(m-1)/2;while(x%2==0)x/=2;for(inti=3;(longlong)(i)*i<=x;i+=2){if(x%i==0){divs[cnt++]=i;while(x%i==0){x/=i;}}}if(x>1){divs[cnt++]=x;}for(intg=2;;g++){boolok=true;for(inti=0;i<cnt;i++){if(pow_mod_constexpr(g,(m-1)/divs[i],m)==1){ok=false;break;}}if(ok)returng;}}template<intm>constexprintprimitive_root=primitive_root_constexpr(m);// @param n `n < 2^32`// @param m `1 <= m < 2^32`// @return sum_{i=0}^{n-1} floor((ai + b) / m) (mod 2^64)unsignedlonglongfloor_sum_unsigned(unsignedlonglongn,unsignedlonglongm,unsignedlonglonga,unsignedlonglongb){unsignedlonglongans=0;while(true){if(a>=m){ans+=n*(n-1)/2*(a/m);a%=m;}if(b>=m){ans+=n*(b/m);b%=m;}unsignedlonglongy_max=a*n+b;if(y_max<m)break;// y_max < m * (n + 1)// floor(y_max / m) <= nn=(unsignedlonglong)(y_max/m);b=(unsignedlonglong)(y_max%m);std::swap(m,a);}returnans;}}// namespace internal}// namespace atcoder#line 10 "atcoder/math.hpp"
namespaceatcoder{longlongpow_mod(longlongx,longlongn,intm){assert(0<=n&&1<=m);if(m==1)return0;internal::barrettbt((unsignedint)(m));unsignedintr=1,y=(unsignedint)(internal::safe_mod(x,m));while(n){if(n&1)r=bt.mul(r,y);y=bt.mul(y,y);n>>=1;}returnr;}longlonginv_mod(longlongx,longlongm){assert(1<=m);autoz=internal::inv_gcd(x,m);assert(z.first==1);returnz.second;}// (rem, mod)std::pair<longlong,longlong>crt(conststd::vector<longlong>&r,conststd::vector<longlong>&m){assert(r.size()==m.size());intn=int(r.size());// Contracts: 0 <= r0 < m0longlongr0=0,m0=1;for(inti=0;i<n;i++){assert(1<=m[i]);longlongr1=internal::safe_mod(r[i],m[i]),m1=m[i];if(m0<m1){std::swap(r0,r1);std::swap(m0,m1);}if(m0%m1==0){if(r0%m1!=r1)return{0,0};continue;}// assume: m0 > m1, lcm(m0, m1) >= 2 * max(m0, m1)// (r0, m0), (r1, m1) -> (r2, m2 = lcm(m0, m1));// r2 % m0 = r0// r2 % m1 = r1// -> (r0 + x*m0) % m1 = r1// -> x*u0*g = r1-r0 (mod u1*g) (u0*g = m0, u1*g = m1)// -> x = (r1 - r0) / g * inv(u0) (mod u1)// im = inv(u0) (mod u1) (0 <= im < u1)longlongg,im;std::tie(g,im)=internal::inv_gcd(m0,m1);longlongu1=(m1/g);// |r1 - r0| < (m0 + m1) <= lcm(m0, m1)if((r1-r0)%g)return{0,0};// u1 * u1 <= m1 * m1 / g / g <= m0 * m1 / g = lcm(m0, m1)longlongx=(r1-r0)/g%u1*im%u1;// |r0| + |m0 * x|// < m0 + m0 * (u1 - 1)// = m0 + m0 * m1 / g - m0// = lcm(m0, m1)r0+=x*m0;m0*=u1;// -> lcm(m0, m1)if(r0<0)r0+=m0;}return{r0,m0};}longlongfloor_sum(longlongn,longlongm,longlonga,longlongb){assert(0<=n&&n<(1LL<<32));assert(1<=m&&m<(1LL<<32));unsignedlonglongans=0;if(a<0){unsignedlonglonga2=internal::safe_mod(a,m);ans-=1ULL*n*(n-1)/2*((a2-a)/m);a=a2;}if(b<0){unsignedlonglongb2=internal::safe_mod(b,m);ans-=1ULL*n*((b2-b)/m);b=b2;}returnans+internal::floor_sum_unsigned(n,m,a,b);}}// namespace atcoder#line 2 "math/stern-brocot-tree-binary-search.hpp"
#line 7 "math/stern-brocot-tree-binary-search.hpp"
usingnamespacestd;#line 2 "math/stern-brocot-tree.hpp"
#line 6 "math/stern-brocot-tree.hpp"
usingnamespacestd;// x / y (x > 0, y > 0) を管理、デフォルトで 1 / 1// 入力が互いに素でない場合は gcd を取って格納// seq : (1, 1) から (x, y) へのパス。右の子が正/左の子が負template<typenameInt>structSternBrocotTreeNode{usingNode=SternBrocotTreeNode;Intlx,ly,x,y,rx,ry;vector<Int>seq;SternBrocotTreeNode():lx(0),ly(1),x(1),y(1),rx(1),ry(0){}SternBrocotTreeNode(IntX,IntY):SternBrocotTreeNode(){assert(1<=X&&1<=Y);Intg=gcd(X,Y);X/=g,Y/=g;while(min(X,Y)>0){if(X>Y){Intd=X/Y;X-=d*Y;go_right(d-(X==0?1:0));}else{Intd=Y/X;Y-=d*X;go_left(d-(Y==0?1:0));}}}SternBrocotTreeNode(constpair<Int,Int>&xy):SternBrocotTreeNode(xy.first,xy.second){}SternBrocotTreeNode(constvector<Int>&_seq):SternBrocotTreeNode(){for(constInt&d:_seq){assert(d!=0);if(d>0)go_right(d);if(d<0)go_left(d);}assert(seq==_seq);}// pair<Int, Int> 型で分数を getpair<Int,Int>get()const{returnmake_pair(x,y);}// 区間の下限pair<Int,Int>lower_bound()const{returnmake_pair(lx,ly);}// 区間の上限pair<Int,Int>upper_bound()const{returnmake_pair(rx,ry);}// 根からの深さIntdepth()const{Intres=0;for(auto&s:seq)res+=abs(s);returnres;}// 左の子に d 進むvoidgo_left(Intd=1){if(d<=0)return;if(seq.empty()orseq.back()>0)seq.push_back(0);seq.back()-=d;rx+=lx*d,ry+=ly*d;x=rx+lx,y=ry+ly;}// 右の子に d 進むvoidgo_right(Intd=1){if(d<=0)return;if(seq.empty()orseq.back()<0)seq.push_back(0);seq.back()+=d;lx+=rx*d,ly+=ry*d;x=rx+lx,y=ry+ly;}// 親の方向に d 進む// d 進めたら true, 進めなかったら false を返すboolgo_parent(Intd=1){if(d<=0)returntrue;while(d!=0){if(seq.empty())returnfalse;Intd2=min(d,abs(seq.back()));if(seq.back()>0){x-=rx*d2,y-=ry*d2;lx=x-rx,ly=y-ry;seq.back()-=d2;}else{x-=lx*d2,y-=ly*d2;rx=x-lx,ry=y-ly;seq.back()+=d2;}d-=d2;if(seq.back()==0)seq.pop_back();if(d2==Int{0})break;}returntrue;}// SBT 上の LCAstaticNodelca(constNode&lhs,constNode&rhs){Noden;for(inti=0;i<min<int>(lhs.seq.size(),rhs.seq.size());i++){Intval1=lhs.seq[i],val2=rhs.seq[i];if((val1<0)!=(val2<0))break;if(val1<0)n.go_left(min(-val1,-val2));if(val1>0)n.go_right(min(val1,val2));if(val1!=val2)break;}returnn;}friendostream&operator<<(ostream&os,constNode&rhs){os<<"\n";os<<"L : ( "<<rhs.lx<<", "<<rhs.ly<<" )\n";os<<"M : ( "<<rhs.x<<", "<<rhs.y<<" )\n";os<<"R : ( "<<rhs.rx<<", "<<rhs.ry<<" )\n";os<<"seq : {";for(auto&x:rhs.seq)os<<x<<", ";os<<"} \n";returnos;}friendbooloperator<(constNode&lhs,constNode&rhs){returnlhs.x*rhs.y<rhs.x*lhs.y;}friendbooloperator==(constNode&lhs,constNode&rhs){returnlhs.x==rhs.xandlhs.y==rhs.y;}};/**
* @brief Stern-Brocot Tree
*/#line 10 "math/stern-brocot-tree-binary-search.hpp"
// 分子と分母が INF 以下である非負の既約分数のうち次のものを返す// first : f(x) が false である最大の既約分数 x// second : f(x) が true である最小の既約分数 x// ただし// - f(0) = true の場合は (0/1, 0/1) を返す// - true になる分数が存在しない場合は (?, 1/0) を返す// - INF = 0 の場合は (0/1, 1/0) を返すtemplate<typenameI,typenameF>autobinary_search_on_stern_brocot_tree(F&&f,constI&INF)->enable_if_t<is_invocable_r_v<bool,F&,pair<I,I>>,pair<pair<I,I>,pair<I,I>>>{// INF >= 0assert(0<=INF);SternBrocotTreeNode<I>m;if(INF==0)return{m.lower_bound(),m.upper_bound()};// INF 条件を超える or f(m) = return_value であるautoover=[&](boolreturn_value){returnmax(m.x,m.y)>INForstd::invoke(f,m.get())==return_value;};if(std::invoke(f,make_pair(0,1)))return{m.lower_bound(),m.lower_bound()};intgo_left=over(true);for(;true;go_left^=1){if(go_left){// f(M) = true -> (L, M] に答えがある// (f(L * b + M) = false) or (INF 超え) になる b の最小は?Ia=1;for(;true;a*=2){m.go_left(a);if(over(false)){m.go_parent(a);break;}}for(a/=2;a!=0;a/=2){m.go_left(a);if(over(false))m.go_parent(a);}m.go_left(1);if(max(m.get().first,m.get().second)>INF)return{m.lower_bound(),m.upper_bound()};}else{// f(M) = false -> (M, R] に答えがある// (f(M + R * b) = true) or (INF 超え) になる b の最小は?Ia=1;for(;true;a*=2){m.go_right(a);if(over(true)){m.go_parent(a);break;}}for(a/=2;a!=0;a/=2){m.go_right(a);if(over(true))m.go_parent(a);}m.go_right(1);if(max(m.get().first,m.get().second)>INF)return{m.lower_bound(),m.upper_bound()};}}}#line 7 "verify/verify-yuki/yuki-2262.test.cpp"
//#line 2 "math/rational.hpp"
#line 6 "math/rational.hpp"
usingnamespacestd;#line 2 "internal/internal-type-traits.hpp"
#line 4 "internal/internal-type-traits.hpp"
usingnamespacestd;namespacenyaan_internal{template<typenameT>usingis_broadly_integral=typenameconditional_t<is_integral_v<T>||is_same_v<T,__int128_t>||is_same_v<T,__uint128_t>,true_type,false_type>::type;template<typenameT>usingis_broadly_signed=typenameconditional_t<is_signed_v<T>||is_same_v<T,__int128_t>,true_type,false_type>::type;template<typenameT>usingis_broadly_unsigned=typenameconditional_t<is_unsigned_v<T>||is_same_v<T,__uint128_t>,true_type,false_type>::type;#define ENABLE_VALUE(x) \
template <typename T> \
constexpr bool x##_v = x<T>::value;
ENABLE_VALUE(is_broadly_integral);ENABLE_VALUE(is_broadly_signed);ENABLE_VALUE(is_broadly_unsigned);#undef ENABLE_VALUE
#define ENABLE_HAS_TYPE(var) \
template <class, class = void> \
struct has_##var : false_type {}; \
template <class T> \
struct has_##var<T, void_t<typename T::var>> : true_type {}; \
template <class T> \
constexpr auto has_##var##_v = has_##var<T>::value;
#define ENABLE_HAS_VAR(var) \
template <class, class = void> \
struct has_##var : false_type {}; \
template <class T> \
struct has_##var<T, void_t<decltype(T::var)>> : true_type {}; \
template <class T> \
constexpr auto has_##var##_v = has_##var<T>::value;
}// namespace nyaan_internal#line 2 "math-fast/gcd.hpp"
#line 4 "math-fast/gcd.hpp"
usingnamespacestd;namespaceBinaryGCDImpl{usingu64=unsignedlonglong;usingi8=char;u64binary_gcd(u64a,u64b){if(a==0||b==0)returna+b;i8n=__builtin_ctzll(a);i8m=__builtin_ctzll(b);a>>=n;b>>=m;n=min(n,m);while(a!=b){u64d=a-b;i8s=__builtin_ctzll(d);boolf=a>b;b=f?b:a;a=(f?d:-d)>>s;}returna<<n;}usingu128=__uint128_t;// a > 0intctz128(u128a){u64lo=a&u64(-1);returnlo?__builtin_ctzll(lo):64+__builtin_ctzll(a>>64);}u128binary_gcd128(u128a,u128b){if(a==0||b==0)returna+b;i8n=ctz128(a);i8m=ctz128(b);a>>=n;b>>=m;n=min(n,m);while(a!=b){u128d=a-b;i8s=ctz128(d);boolf=a>b;b=f?b:a;a=(f?d:-d)>>s;}returna<<n;}}// namespace BinaryGCDImpllonglongbinary_gcd(longlonga,longlongb){returnBinaryGCDImpl::binary_gcd(abs(a),abs(b));}__int128_tbinary_gcd128(__int128_ta,__int128_tb){if(a<0)a=-a;if(b<0)b=-b;returnBinaryGCDImpl::binary_gcd128(a,b);}/**
* @brief binary GCD
*/#line 10 "math/rational.hpp"
// T : 値, U : 比較用template<typenameT,typenameU>structRationalBase{usingR=RationalBase;usingKey=T;Tx,y;RationalBase():x(0),y(1){}template<typenameT1>RationalBase(constT1&_x):RationalBase<T,U>(_x,T1{1}){}template<typenameT1,typenameT2>RationalBase(constpair<T1,T2>&_p):RationalBase<T,U>(_p.first,_p.second){}template<typenameT1,typenameT2>RationalBase(constT1&_x,constT2&_y):x(_x),y(_y){assert(y!=0);if(y==-1)x=-x,y=-y;if(y!=1){Tg;ifconstexpr(nyaan_internal::is_broadly_integral_v<T>){ifconstexpr(sizeof(T)==16){g=binary_gcd128(x,y);}else{g=binary_gcd(x,y);}}else{g=gcd(x,y);}if(g!=0)x/=g,y/=g;if(y<0)x=-x,y=-y;}}// y = 0 の代入も認めるstaticRraw(T_x,T_y){Rr;r.x=_x,r.y=_y;returnr;}friendRoperator+(constR&l,constR&r){if(l.y==r.y)returnR{l.x+r.x,l.y};returnR{l.x*r.y+l.y*r.x,l.y*r.y};}friendRoperator-(constR&l,constR&r){if(l.y==r.y)returnR{l.x-r.x,l.y};returnR{l.x*r.y-l.y*r.x,l.y*r.y};}friendRoperator*(constR&l,constR&r){returnR{l.x*r.x,l.y*r.y};}friendRoperator/(constR&l,constR&r){returnR{l.x*r.y,l.y*r.x};}R&operator+=(constR&r){return(*this)=(*this)+r;}R&operator-=(constR&r){return(*this)=(*this)-r;}R&operator*=(constR&r){return(*this)=(*this)*r;}R&operator/=(constR&r){return(*this)=(*this)/r;}Roperator-()const{returnraw(-x,y);}Rinverse()const{assert(x!=0);Rr=raw(y,x);if(r.y<0)r.x=-r.x,r.y=-r.y;returnr;}Rpow(longlongp)const{Rres{1},base{*this};while(p){if(p&1)res*=base;base*=base;p>>=1;}returnres;}friendbooloperator==(constR&l,constR&r){returnl.x==r.x&&l.y==r.y;};friendbooloperator!=(constR&l,constR&r){returnl.x!=r.x||l.y!=r.y;};friendbooloperator<(constR&l,constR&r){returnU{l.x}*r.y<U{l.y}*r.x;};friendbooloperator<=(constR&l,constR&r){returnl<r||l==r;}friendbooloperator>(constR&l,constR&r){returnU{l.x}*r.y>U{l.y}*r.x;};friendbooloperator>=(constR&l,constR&r){returnl>r||l==r;}friendostream&operator<<(ostream&os,constR&r){os<<r.x;if(r.x!=0&&r.y!=1)os<<"/"<<r.y;returnos;}// T にキャストされるので T が bigint の場合は to_ll も要るTto_mint(Tmod)const{assert(mod!=0);Ta=y,b=mod,u=1,v=0,t;while(b>0){t=a/b;swap(a-=t*b,b);swap(u-=t*v,v);}returnU((u%mod+mod)%mod)*x%mod;}};usingRational=RationalBase<longlong,__int128_t>;usingFraction=Rational;#line 9 "verify/verify-yuki/yuki-2262.test.cpp"
//#line 2 "multiplicative-function/enumerate-sum-of-multiplicative-function.hpp"
#line 4 "multiplicative-function/enumerate-sum-of-multiplicative-function.hpp"
usingnamespacestd;#line 2 "math/enumerate-quotient.hpp"
#line 2 "math/isqrt.hpp"
#line 4 "math/isqrt.hpp"
usingnamespacestd;// floor(sqrt(n)) を返す (ただし n が負の場合は 0 を返す)longlongisqrt(longlongn){if(n<=0)return0;longlongx=sqrt(n);while((x+1)*(x+1)<=n)x++;while(x*x>n)x--;returnx;}#line 4 "math/enumerate-quotient.hpp"
namespaceEnumerateQuotientImpl{longlongfast_div(longlonga,longlongb){return1.0*a/b;};longlongslow_div(longlonga,longlongb){returna/b;};}// namespace EnumerateQuotientImpl// { (q, l, r) : forall x in (l,r], floor(N/x) = q }// を引数に取る関数f(q, l, r)を渡す。範囲が左に半開なのに注意// 商は小さい方から走査するtemplate<typenameT,typenameF>voidenumerate_quotient(TN,constF&f){Tsq=isqrt(N);#define FUNC(d) \
T upper = N, quo = 0; \
while (upper > sq) { \
T thres = d(N, (++quo + 1)); \
f(quo, thres, upper); \
upper = thres; \
} \
while (upper > 0) { \
f(d(N, upper), upper - 1, upper); \
upper--; \
}
if(N<=1e12){FUNC(EnumerateQuotientImpl::fast_div);}else{FUNC(EnumerateQuotientImpl::slow_div);}#undef FUNC
}/**
* @brief 商の列挙
*/#line 8 "multiplicative-function/enumerate-sum-of-multiplicative-function.hpp"
/**
* S(f, n) = f(1) + f(2) + ... + f(n) とする
* f と g のディリクレ積を h とする
* S(h, n) と S(g, n) が高速に計算できる, かつ g(1) = 1 のとき
* S(f, N/i) を O(N^{3/4}) で列挙できる
*
* うまくやると O~(N^{2/3}) に落ちたり g(1) != 1 に対応できる
* https://codeforces.com/blog/entry/54150
*/template<typenameT,typenameSG,typenameSH>structenumerate_mf_prefix_sum{longlongN,sq;constSGsg;constSHsh;vector<T>small,large;T&ref(longlongx){if(x<=sq){returnsmall[x];}elseif(N<=1000000000000LL){returnlarge[1.0*N/x];}else{returnlarge[N/x];}}enumerate_mf_prefix_sum(longlong_n,SG_sg,SH_sh):N(_n),sq(isqrt(N)),sg(_sg),sh(_sh){small.resize(sq+1);large.resize(sq+1);enumerate_quotient(N,[&](longlongn,longlong,longlong){T&cur=(ref(n)=sh(n));enumerate_quotient(n,[&](longlongq,longlongl,longlongr){if(q!=n)cur-=ref(q)*(sg(r)-sg(l));});});}Tget(longlongn){returnref(n);}Toperator()(longlongn){returnget(n);}};/**
* @brief 乗法的関数のprefix sum の列挙
*/#line 11 "verify/verify-yuki/yuki-2262.test.cpp"
usingnamespaceNyaan;usingSBT=SternBrocotTreeNode<ll>;// k 番目に小さいplcalc(llN,llK){autosg=[](intn)->int{returnn;};autosh=[](int)->int{return1;};enumerate_mf_prefix_sum<int,decltype(sg),decltype(sh)>moe(N,sg,sh);autocnt=[&](Rationalf)->ll{lls=0;enumerate_quotient(N,[&](llq,lll,llr){llx=0;x+=atcoder::floor_sum(r+1,f.y,f.x,0);x-=atcoder::floor_sum(l+1,f.y,f.x,0);s+=x*moe(q);});returns;};autojudge=[&](pair<ll,ll>f)->bool{returncnt({f.first,f.second})>=K;};autoans=binary_search_on_stern_brocot_tree<ll>(judge,N).second;return{ans.first,ans.second};}voidq(){inl(N,K);autog=[](lln)->ll{returnn;};autoh=[](lln)->ll{returnn*(n+1)/2;};enumerate_mf_prefix_sum<ll,decltype(g),decltype(h)>tot(N,g,h);lls=tot(N)-1;trc(s);llp=-1,q=-1;if(K<=s){tie(p,q)=calc(N,K);}elseif(K==s+1){p=q=1;}elseif(K<=s*2+1){tie(q,p)=calc(N,2*s+1-(K-1));}else{// do nothing}if(p==-1){out(-1);}else{cout<<p<<"/"<<q<<"\n";}}voidNyaan::solve(){intt=1;in(t);while(t--)q();}