2017 Chinese Multi-University Training, BeihangU Contest 北大 多校 gym 102253

2017 Chinese Multi-University Training, BeihangU Contest

D. Division Game

显然p是没用的。记 f ( x ) f(x) f(x)为对大小为N的石子操作x次后不为0的方案数,那么显然 f ( x ) f(x) f(x)也是 x + 1 x+1 x+1步变成 1 1 1的方案数。那么对于每个 e i e_i ei,做 x x x步后大于 1 1 1就是把 e i e_i ei分割成 x + 1 x+1 x+1段,对于每个单独 e i e_i ei某一段大小可以是0,所以大小应该是

g ( x ) = Π C e i + x x g(x)=\Pi C_{e_i+x}^{x} g(x)=ΠCei+xx

但我们知道不能所有 e i e_i ei分割后同一段都是0。那么考虑容斥,即我可以在 x + 1 x+1 x+1段中选 j j j段使这 j j j段是0。容斥后得到答案

f ( x ) = ∑ j = 0 x g ( x − j + 1 ) ∗ C x + 1 j ∗ ( − 1 ) j f(x)=\sum_{j=0}^xg(x-j+1)*C_{x+1}^j*(-1)^{j} f(x)=j=0xg(xj+1)Cx+1j(1)j

NTT求出F。

E. Expectation of Division

与D题相同,答案与 p i p_i pi无关,只和次数 e i e_i ei有关。不同的质因子不超过20个,假设不同质因子有m个。
N = Π i = 1 m p i e i N=\Pi_{i=1}^m p_i^{e_i} N=Πi=1mpiei
考虑m维dp , d p ( x ) dp(x) dp(x)表示当前状态 x x x变成1的期望操作数,其中 x x x为一个 m m m维向量 ( e 1 , e 2 , . . . , e m ) (e_1,e_2,...,e_m) (e1,e2,...,em)。注意这道题一次操作可以不变,那么
d p ( x ) = ∑ y < x d p ( y ) Π ( e i + 1 ) + 1 1 − 1 Π ( e i + 1 ) dp(x)=\frac{\sum_{y<x} dp(y)}{\Pi (e_i+1)}+\frac{1}{1-\frac{1}{\Pi (e_i+1)}} dp(x)=Π(ei+1)y<xdp(y)+1Π(ei+1)11
考虑到 1 0 24 < 2 80 10^{24}<2^{80} 1024<280,但实际上并不需要每一维度都有这么大,暴力搜索出所有可行状态,大约有 1.7 ∗ 1 0 5 1.7*10^5 1.7105个,维护高维前缀和转移即可。

G. Gear Up

每棵树固定根,只需要维护每个点的相对角速度即可。修改一个齿轮大小会影响子树的相对角速度,对每个点标记dfs序,强制先访问与自己角速度相同的点,那么每次只用修改一段连续的区间即可。

I. I Curse Myself

由于保证了边最多出现在一个简单环了,那么这是一个边仙人掌。把所有环拿出来,生成树就是在每个环上去掉一条边。那么重新构图,把每个环上所有边并联在两点之间,问题转化成第K短路。

J. Journey with Knapsack

生成函数,只需要求出多项式
Π i = 1 n 1 − x ( a i + 1 ) ∗ i 1 − x i = Π i = 1 n ( 1 − x ( a i + 1 ) ∗ i ) ∗ Π i = 1 n 1 1 − x i \Pi_{i=1}^n \frac{1-x^{(a_i+1)*i}}{1-x^i}=\Pi_{i=1}^n (1-x^{(a_i+1)*i})*\Pi_{i=1}^n\frac{1}{1-x^i} Πi=1n1xi1x(ai+1)i=Πi=1n(1x(ai+1)i)Πi=1n1xi1
的前 2 n 2n 2n项系数。
乘法左右两边分开处理。
由于保证了 a i < a i + 1 a_i<a_{i+1} ai<ai+1,那么 a i > = i − 1 a_i>=i-1 ai>=i1
因此当 i > 2 n i>\sqrt{2n} i>2n 时不会对前 2 n 2n 2n项系数产生影响。
Π i = 1 n ( 1 − x ( a i + 1 ) ∗ i ) → Π i = 1 2 n ( 1 − x ( a i + 1 ) ∗ i ) \Pi_{i=1}^n (1-x^{(a_i+1)*i}) \to \Pi_{i=1}^{\sqrt{2n}} (1-x^{(a_i+1)*i}) Πi=1n(1x(ai+1)i)Πi=12n (1x(ai+1)i)
O ( n n ) O(n\sqrt{n}) O(nn )暴力计算即可。
Π i = 1 n 1 1 − x i \Pi_{i=1}^n\frac{1}{1-x^i} Πi=1n1xi1是正整数拆分的生成函数,直接计算正整数拆分即可。 O ( n n ) O(n\sqrt{n}) O(nn )

你可能感兴趣的:(codeforces,gym)