[2022牛客多校赛第四场] C-Easy Counting Problem
作者:互联网
题目大意
统计长度为\(n\)且数位\(i\)出现至少\(c_i\)次的数字串数量。
\(i\in[0,w)\) \((2\leq w\leq 10)\)
\(1\leq c_i\leq 50000,\sum c_i\leq 50000\)
\(q (1\leq q\leq 300)\) 次询问,每次询问 \(n (1\leq n\leq 10^7)\)
题解
若 \(i\) 恰好出现 \(c_i\) 次,且 \(n=\sum c_i\),则方案数为 \(\frac{n!}{\prod_i c_i !}\)。
考虑指数型生成函数,
\[\exp(x)=\sum_{i=0}^\infty \frac{x^i}{i!} \]数位 \(i\) 至少出现 \(c_i\) 次,所以需要减去次数小于 \(c_i\) 的项,即 \(\exp(x)-\sum_{i=0}^{c_i-1}\frac{x^i}{i!}\)
则最终答案为
\[[x^n]n!\prod_{k=1}^{w}\left(\exp(x)-\sum_{i=0}^{c_k-1}\frac{x^i}{i!}\right) \]但是 \(n\) 太大了,不好直接卷积出来。
令 \(g_k(x)=\sum_{i=0}^{c_k-1}\frac{x^i}{i!}\)
考虑一下这个式子
\[\prod_{k=1}^{w}\left(\exp(x)-g_k(x)\right) \]\[(\exp(x)-g_1(x))(\exp(x)-g_2(x))=\\ \exp(2x)-(g_1(x)+g_2(x))\exp(x)+g_1(x)g_2(x) \]发现 \(\prod_{k=1}^{w}\left(\exp(x)-g_k(x)\right)\) 是 \(\sum_{k=0}^{w} \exp(kx)f_k(x)\) 的形式。
于是我们想要求出 \(f_0(x),f_1(x),\cdots,f_w(x)\)
设 \(dp(i,j)\) 只考虑前 \(i\) 个 \((\exp(x)-g(x))\) 时 \(f_j(x)\) 的值,则有
\[dp(i,j)=dp(i-1,j)-dp(i-1,j-1)g_i(x)\\ =dp(i-1,j)-dp(i-1,j-1)\left(\sum_{j=0}^{c_i-1}\frac{x^j}{j!}\right) \]设 \(s=\sum c_i\),于是只要进行 \(w^2\) 次卷积就能计算出 \(f_0(x),f_1(x),\cdots,f_w(x)\),时间复杂度 \(O(w^2s\log s)\)。
对于单次询问,给定 \(n\),我们需要计算出 \(n!\sum_{k=0}^{w} \exp(kx)f_k(x)\) 的 \(n\) 次项系数即为答案。对于每个 \(\exp(kx)f_k(x)\),直接暴力卷积 \(n\) 次项,因为 \(f_k(x)\) 最高不超过 \(s\) 次项,所以时间复杂度为 \(O(s)\),每次询问要暴力求 \(w\) 个卷积,复杂度 \(O(ws)\),\(q\) 次询问,复杂度 \(O(qws)\)。还需要 \(O(n)\) 预处理阶乘及其逆元,综上,本题的时间复杂度为 \(O(n+w^2s\log s+qws)\)。
Code
标签:第四场,2022,leq,sum,牛客,exp,frac,复杂度,dp 来源: https://www.cnblogs.com/AEMShana/p/16537705.html