去年没有参加,但是知道为什么要ban掉Python了,D题即使C++的long double精度也远远不够,50!精度大概是200bit,只能用decimal或fraction,更推荐后者,因为分数表示是零误差的
from itertools import accumulate
from operator import mul
from fractions import Fraction
from bisect import *

fact = [1]; fact.extend(accumulate(range(1,51),mul))

def comb(n,k):
    return fact[n]//(fact[n-k]*fact[k]) if 0 <= k <= n else 0

def main():
    for _ in range(int(input())):
        n,b,r,p = map(int,input().split())
        p = Fraction(p,100)
        s = [Fraction(comb(n-b-r,m-b),comb(n,m)) for m in range(n+1)]
        t = [0]; t.extend(accumulate(s))
        
        class A:
            def __len__(self):
                return n+2

            def __getitem__(self,length):
                return length and any(
                    (t[i+length]-t[i])/t[-1] >= p
                    for i in range(n+2-length)
                )
        
        length = bisect_left(A(),1)
        for i in range(n+2-length):
            if (t[i+length]-t[i])/t[-1] >= p:
                print(i,i+length-1); break
        else: print(-1)
        
main()