一些小 trick 的结合。
考虑计算分数小于 y 的方案数。
也即分数不超过 y−1 的方案数。
然后取补集再除总方案数。
设 F(z) 表示现实中答案的前缀和的 OGF。
那么显然 F(z)=11−zn∏i=11−zai+11−z=1(1−z)n+1n∏i=1(1−zai+1)
前面部分可以直接随便展开,后面部分考虑 ln 之后调和级数计算再 exp 回去。
然后询问实际上是要求 [zy−1]1−zx+11−zap+1F(z)
将左边分式的分子拆开,容易发现需要计算的是形如以下形式的问题 [zy]11−zaF(z)
考虑根号分治,设阈值 B。
若 a≤B,考虑预处理出所有答案。
若 a>B,考虑暴力计算。
视 n,q,ai,x,y 同阶,则取 B=O(√n) 时最优,复杂度为 O(n√n)。
代码:
1 |
|