去年没有参加,但是知道为什么要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()