JZOJ5520 Every one will meet some difficult
原题TCO2013 3A TrichyInequality
Description
满足(sumlimits_{i = 1}^m {a_i} le S 且 forall i, a_i > 0, forall i le n, a_i le T)的(a)的解的组数
(n le m le 10^9, T le 10^5, n imes T le S le 10^{18}, m − n le 1000)
Solution
转自
容斥,枚举前面多少个(a)超过了(T)的限制
考虑上面容斥的式子用另一种组合意义来描述
- 有(S)个位置,每个位置可以是(0/1),这些位置分成(n + 1)块,前n块每块有(T)个位置,最后一块有(S - nT)个位置,现在要选出(m)个位置来放(1),前面n块要求每一块中至少有一个(1),问方案数
此时这个容斥就相当于枚举前面有多少块是没有放1的,显然这式子也是成立的
考虑生成函数,前(n)块每一块的生成函数就是((1 + x)^T − 1),最后一块的生成函数就是((1 + x)^{S − nT})
现在要求的就是多项式(((1 + x)^T − 1)^n (1 + x)^{S − nT})的(x^m)项系数
那么这个(m − n le 1000)该怎么用呢?
观察上面的多项式前面括号里的部分,发现它常数项是(0)
这也就意味着整个多项式(0)次到(n - 1)次的系数全是(0)
那么我们将这个多项式除以(x^n)
现在要求的就是$$[x^{m - n}]frac{((1 + x)^T − 1)^n (1 + x)^{S − nT}}{x^n}$$
那么我们暴力用快速幂来做,每次乘完只保留(x^{m − n + 1})以下的项,除以(x^n)实际上就是在乘(n)次方之前将所有项左移一位
这样就在((m − n)^2 (log n + log(S − nT)))的时间内做完啦
还可以采用NTT优化(需要用任意模数NTT)
2019省选联合训练10 T2 K菌的游戏
Description
一棵有根树,满足每个点的标号小于其父亲的编号。初始时石子在根上,两人轮流向儿子移动,不能移动的输。计数。
Solution
设先手必胜的EOF为(f(x))
满足(f'(x) + exp(f(x)) = frac{1}{1 - x})
两边积分得(f(x) + int exp(f(x)) dx = -ln(1 - x))
可以发现(int exp(f(x)) dx)就是先手必败的EOF,记其为(g(x))
所以原式变为(
egin{cases}
f(x) + g(x) = -ln(1 - x) (1) \
g(x) = int exp(f(x)) dx (2)
end{cases})
对(2)两边求导得(g'(x) = exp(f(x)))
两边取ln得(ln(g'(x)) = f(x))
代入(1)得(g(x) + ln(g'(x)) = -ln(1 - x))
两边exp得(exp(g(x)) g'(x) = frac{1}{1 - x})
两边积分得(int exp(g(x)) g'(x) dx = int frac{1}{1 - x} dx)
由((exp cdot g)'(x) = exp(g(x)) g'(x))可得(exp(g(x)) = int frac{1}{1 - x} dx)
两边取ln得(g(x) = ln(int frac{1}{1 - x} dx + 1))
即(g(x) = ln(sumlimits_{i = 1}^{infty} frac{x^i}{i} + 1))
THUWC2018 Day2T2 sequence 七彩序列
Description
有(n)种颜色的小球,第(i)种有(a_i)个,现在询问不存在任意一个非空前缀或者非空后缀满足(n)种颜色的小球出现的次数相同的排列的方案数对(998244353)取模
(比如112122111111不合法,因为前缀112122中,两种颜色都出现了3次)
(n le 100, a_i le 20000)
Solution
显然对后缀的要求可以转化为对前缀的要求
令(A = min a_i, B = max a_i)
记(f_i)为每种颜色都为(i)的只包含一个不合法位置(就是第(n imes i)位)的方案数
记(g_i)为第(j)种颜色为(a_j - A + i)的只包含一个不合法位置(就是第(sum_{j = 1}^{n} {i + a_j - A})位)的方案数
显然有(f_i = frac{(in)!}{(i!)^k} - sumlimits_{j = 1}^{i - 1} {f_j frac{((i - j)n)!}{((i - j)!)^k}} - sumlimits_{j = 1}^{i + A - B} {g_j frac{(sumlimits_{k = 1}^{n} {i - j + A - a_k})!}{prodlimits_{k = 1}^{n} {(i - j + A - a_k)!}}})
(g_i = frac{(sumlimits_{j = 1}^{n} {i + a_j - A})!}{prodlimits_{j = 1}^{n} {(i + a_j - A)!}} - sumlimits_{j = 1}^{i - 1} {g_j frac{((i - j)n)!}{((i - j)!)^k}} - sumlimits_{j = 1}^{i} {f_j frac{(sumlimits_{k = 1}^{n} {i - j + a_k - A})!}{prodlimits_{k = 1}^{n} {(i - j + a_k - A)!}}})
不妨记(u(i) = egin{cases} 0 & i < 0 \ frac{(in)!}{(i!)^k} & i ge 0 end{cases}, v(i) = egin{cases} 0 & i < B - A \ frac{(sumlimits_{k = 1}^{n} {i + A - a_k})!}{prodlimits_{k = 1}^{n} {(i + A - a_k)!}} & i ge B - A end{cases}, w(i) = egin{cases} 0 & i < 0 \ frac{(sumlimits_{j = 1}^{n} {i + a_j - A})!}{prodlimits_{j = 1}^{n} {(i + a_j - A)!}} & i ge 0 end{cases})
上面的递推式可以简写为(f_i = u(i) - sumlimits_{j = 1}^{i - 1} {u(i - j) f_j} - sumlimits_{j = 1}^{i - 1} {v(i - j) g_j})
(g_i = w(i) - sumlimits_{j = 1}^{i - 1} {u(i - j) g_j} - sumlimits_{j = 1}^{i} {w(i - j) f_j})
这递推具有卷积形式,于是就可以愉快的分治FFT了
有一种特殊情况,当所以颜色的个数都一样时,(g)是没有用的,不要算
太懒了,不想写代码,我也不能保证以上做法是正确的
美丽的一道期望题
Description
有(n)个点的图,每个点有一个点权(w_i),任意两个点之间都有(frac{1}{2})的概率相连,定义一个联通块的权值为这个联通块内最小的点权,定义一个图的权值为权值最大的联通块的权值,求图的期望权值
(n le 10^5),对(998244353)取模
Solution
将期望转化为计数
将所有点权从小到大排序
令(f_i)为(i)个点的联通图的方案数
令(g_i)为(i)个点的所有情况的((-1)^{联通块个数})之和
令(h_i)为第(i)个点为它的联通块内最小的元素,它所在的联通块为权值最大的联通块的方案数
显然有(f_0 = 0, f_i = 2^{inom{i}{2}} - sumlimits_{j = 1}^{i - 1} {inom{i - 1}{j - 1} 2^{inom{i - j}{2}} f_j})
(g_0 = 1, g_i = -sumlimits_{i = 1}^{n} {inom{i - 1}{j - 1} f_j g_{i - j}})
考虑容斥,根据(sumlimits_{i = 0}^{k} inom{k}{i} (-1)^i = [k = 0])有
(h_i = -sumlimits_{j = 0}^{n - i} {inom{n - i}{j} 2^{inom{n - j}{2}} g_{j + 1}})
求(f, g)可以直接分治FFT,(h)卷积一下就可以了,时间复杂度(O(n log^2 n))
令(A = sumlimits_{i = 0}^{infty} {2^{inom{i}{2}} x^i})
(f)求逆可得,也等于(ln A)
(g = exp {-f} = frac{1}{exp f} = frac{1}{A})
(f, g)均可求逆得,(h)再卷积一下
总得时间复杂度为(O(n log n)),复杂度优秀,只需要求逆,常数优秀
PKUWC2018 猎人杀
Description
给你(n)个球,每个球有个权重(w_i),每次加权随机扔掉一个球,求一号球是最后一个被扔出去的概率
(sumlimits_{i = 1}^{n} {w_i} le 10^5, forall i in [1, n], w_i > 0)
Solution
直接求会发现分母不一样,不好算
我们可以将模型转化,每次加权随机选择一个球,球可以重复被选,若这个球还在就把它扔掉,求一号球是最后一个被扔出去的概率
令全集为(U),(sum(S) = sumlimits_{i in S}^{} {w_i}),当前状态下被扔掉的球的集合为(S)
选到第(i(i
otin S))个球的概率为(p),则(p = frac{sum(S)}{sum(U)} p + frac{w_i}{sum(U)} Rightarrow p = frac{w_i}{sum(U) - sum(S)})
可以发现这与原题要求的概率相同,即这两个模型是等价的
接下来考虑容斥,枚举一定在一号球之后被扔掉的球的集合(T)
分治FFT计算类似于背包的部分即可
设(m = sumlimits_{i = 1}^{n} {w_i}),时间复杂度(m log^2 m)
也可以手动展开(ln),再(exp)回去,时间复杂度为(m log m)
Extention
用这个套路也可以解决UOJ#390. 【UNR #3】百鸽笼