多校联训多项式和生成函数专题

CF286E Ladies' Shop

容易想到一个背包做法,复杂度但显然过不去。

发现如果集合不合法,当且仅当有一些数能凑出集合中没有的数。

进而可以递归地证明,无论是判断是否合法还是检查某个元素是否可以被其它元素拼出,只需要考虑两个元素的情况即可。

因此只需要将所有元素放进一个桶中,自己和自己卷一下,分类讨论即可。

点击查看代码

CF960G Bandit Blues

发现最大值会将整个序列划分成两部分,两部分对称,先考虑算一边。

\(f[i][j]\) 表示填了 \(i\) 个数,有 \(j\) 个最大值,每次插入一个最小的数,枚举插在哪里,有:

\[f[i][j]=f[i-1][j-1]+j\times f[i-1][j] \]

发现这是第一类斯特林数,考虑合并左右两边,有:

\[Ans=\sum_{i=1}^n{i\brack a-1}×{n-i-1\brack b-1}×{n-1\choose i} \]

这相当于是先将 \(n-1\) 个元素划分成两部分,再分别将两部分分别划分成 \(a-1\) 个和 \(b-1\) 个环,考虑先将 \(n-1\) 个元素划分成 \(a+b-2\) 个环,然后将环成成两部分,有:

\[Ans={n-1\brack a+b-2}{a+b-2\choose a-1} \]

现在只需求 \(\Large{n-1\brack a+b-2}\) ,考虑 \({\Large{a\brack b}}\large=[x^b]\prod_{i=0}^{a-1}\limits (x+i)\)

像线段树一样分治下去,一层一层卷起来即可,时间复杂度 \(O(n\log^2n)\)

CF986D Perfect Encoding

容易发现答案具有单调性,故可以二分答案,本题转化为一个判定性问题。

我们要求:和为 \(k\) 的若干个数的最大乘积 \(f(k)\) 是多少。

稍微手玩几个数就能发现,最优方案是拆出先若干个 \(3\),后面零头部分根据 \(k\)\(3\) 的情况拆 \(0\)\(1\)\(2\)\(2\)

具体来说:

  • \(f(k)=3^{k/3}(k\equiv 0\pmod{3})\)
  • \(f(k)=2\times 3^{(k-2)/3}(k\equiv 1\pmod{3})\)
  • \(f(k)=4\times 3^{(k-4)/3}(k\equiv 2\pmod{3})\)

故我们只需计算出 \(f(k)\) 的值,与 \(n\) 相比较就行了。

注意到本题 \(\lg n\)\(10^6\) 级别的,所以高精乘法要用 \(\text{FFT}\) 优化。

注意到答案在 \(3\times\log_3n\) 附近,所以从 \(3\times\log_3n\) 开始暴力枚举答案,复杂度可以降低一个 \(\log\)

点击查看代码

CF623E Transforming Sequence

我们设 \(dp[i][j]\) 表示前面 \(i\) 个数的或值有 \(j\) 位为一,可以得到转移式:

\[dp[i][j]=\sum_{k=0}^{j} dp[i-1][k]\binom{j}{k}2^{k} \]

这个式子应该很好理解,这里就不进行解释了。

边界条件就是 \(dp[1][0]=0,dp[1][i]=1(i\le k)\)

我们又发现:

\[dp[n+m][i]=\sum_{j=0}^{i} dp[n][j]\times dp[m][i-j]\binom{i}{j}2^{m\times j} \]

于是,我们就可以使用倍增解决了。即:

\[dp[2n][i]=\sum_{j=0}^{i} dp[n][j]\times dp[n][i-j]\binom{i}{j}2^{n\times j} \]

需要使用任意模数 \(\text {NTT}\)

点击查看代码

[AGC021F] Trinity

写出朴素的 dp 式子:

\[dp_{m, n} = (1 + \binom{n + 1}{2})dp_{m - 1, n} + \sum_{i < n} \binom{n + 2}{i}dp_{m - 1, i} \]

第一部分可以直接转移,第二部分可以 \(\text{NTT}\) 优化,时间复杂度 \(O(nm\log n)\)

点击查看代码

CF1528F AmShZ Farm

不妨把题目换个说法:我们有 \(n+1\) 个位置排成一排,有 \(n\) 个人要坐进来,第 \(i\) 个人一开始会到位置 \(a_i(1≤a_i≤n)\),如果位置已满就往编号大的位置走,如果最后剩下的位置是 \(n+1\) 的话就是一个合法的 \(a\) 序列。

这是一个经典的序列转等概率环模型(第二次见了),所以我们可以改写题目为:有 \(n+1\) 个位置排成一个环,有 \(n\) 个人要坐进来,第 \(i\) 个人一开始会到位置 \(a_i(1≤a_i≤n+1)\),如果位置已满就往右边走,如果最后剩下的位置是 \(n+1\) 的话就是一个合法的 \(a\) 序列。

因为是一个环并且初始到每个点的概率相同,所以每个点被空出来的概率也是相同的,不难发现方案数就是 \((n+1)^{n−1}\)

我们再深入下去剖析这个模型,对于每种合法的 \(a\) 序列都可以映射到 \(n\) 种不同的不合法序列,因为如果我们让 \(a_i\) 变成 \((a_i+x−1)%(n+1)+1\),那么空出的位置 \(t\) 会变成 \((x+t−1)%(n+1)+1\),由此引出一个重要的性质:对于这 \(n+1\) 个方案来说,数字的分布情况是不会改变的,所以我们可以统计出所有排列的答案再除以 \(n+1\)

\(a\) 数组差不多搞定了,我们来解决 \(b\) 数组的计数。

枚举数字 \(x\) 的出现次数 \(i\),由于 \(x\)\(n+1\) 种选择,除 \(n+1\) 之后又要乘上 \(n+1\) ,所以可以写出答案式:

\[\sum_{i=0}^n{n\choose i}⋅n^{n−i}⋅i^k \]

考虑:

\[n^k=\sum_{i=0}^k{k\brace i}{n\choose i}i! \]

有:

\[\sum_{i=0}^n{n\choose i}⋅n^{n−i}⋅i^k=\sum_{i=0}^n{n\choose i}⋅n^{n−i}⋅\sum_{j=0}^k{k\brace j}{i\choose j}j!\\ =\sum_{i=0}^nn^{n−i}⋅\sum_{j=0}^k{k\brace j}⋅{n\choose i}{i\choose j}j!\\ =\sum_{i=0}^nn^{n−i}⋅\sum_{j=0}^k{k\brace j}⋅{n\choose j}{n-j\choose i-j}j!\\ =\sum_{j=0}^k{k\brace j}{n\choose j}j!⋅\sum_{i=j}^nn^{n−i}⋅{n-j\choose i-j}\\ =\sum_{j=0}^k{k\brace j}{n\choose j}j!⋅\sum_{i=0}^{n-j}n^{n−i-j}⋅{n-j\choose i}\\ =\sum_{j=0}^k{k\brace j}{n\choose j}j!⋅(1+n)^{n-j}\\ \]

上面的式子显然可以 \(O(n\log n)\) 算,现在的问题就是快速算第二类斯特林数了,\(S(n,m)\) 的组合意义是 \(n\) 个不同的小球放在 \(m\) 个相同盒子的方案数,要求盒子非空,所以我们容斥空盒子数量:

\[S(n,m)=\frac {1}{m!}\sum_{k=0}^m(−1)^k{m\choose k}(m−k)^n \]

因为盒子是相同的所以要除以盒子的排列 \(\dfrac{1}{m!}\) ,可以通过变形让它可以卷积:

\[S(n,m)=\sum_{k=0}^m\frac{(−1)^k}{k!}⋅\frac{(m−k)^n}{(m−k)!} \]

所以总时间复杂度 \(O(n\log n)\)

点击查看代码

CF1553I Stairs

【UR #19】通用测评号

【UNR #3】百鸽笼

#498. 新年的追逐战

Gym 103415A Math Ball

CF1477F Nezzar and Chocolate Bars

[AGC034F] RNG and XOR

[AGC038E] Gachapon

Gym 102978F Find the LCA

posted @ 2022-06-11 18:21  一粒夸克  阅读(48)  评论(0编辑  收藏  举报