Epic Convolution

Epic Convolution!

因为这道题是五合一 所以我用了 鸢一折纸 的天使来命名。

Epic Convolution

话说卡老师到底会不会 Epic Convolution II 啊,这玩意有没有被解决啊

尝试写一篇人话题解。

在做这道题之前,你需要仔细阅读 具体数学(Concrete Mathematics) 的 6.2 章节,下面列出一些之后要用到的东西:

\[m!\begin{Bmatrix}n\\m\end{Bmatrix}=\sum_k k^n\binom{m}{k}(-1)^{m-k} \]

\[\begin{Bmatrix}n\\m\end{Bmatrix}=\sum_k \frac{k^n(-1)^{m-k}}{k!(m-k)!} \]

\[\left\langle\begin{matrix}n\\m\end{matrix}\right\rangle=\sum_{k}\begin{Bmatrix}n\\k\end{Bmatrix}\binom{n-k}{m}(-1)^{n-k-m}k!=\sum_{k=0}^m\binom{n+1}{k}(m+1-k)^n(-1)^k \]

\[\left\langle\left\langle\begin{matrix}n\\k\end{matrix}\right\rangle\right\rangle=(k+1)\left\langle\left\langle\begin{matrix}n-1\\k\end{matrix}\right\rangle\right\rangle+(2n-1-k)\left\langle\left\langle\begin{matrix}n-1\\k-1\end{matrix}\right\rangle\right\rangle \]

\[\left\langle\left\langle\begin{matrix}n\\k\end{matrix}\right\rangle\right\rangle=\sum_{i=0}^k\binom{2n+1}{i}(-1)^{i}\begin{Bmatrix}n+k+1-i\\k+1-i\end{Bmatrix} \]

接下来依次分析各个 Subtask。

Subtask 1

\[\begin{aligned} f_n&=\sum_{k=0}^nk^ng_kh_{n-k}\\ &=\sum_{k=0}^{m-1}k^n \end{aligned} \]

由于 \(n\) 固定,预处理幂的前缀和即可。

复杂度为 \(O(n)-O(1)\)​。

namespace Shemesh{
	ll ans[N];
    void Metatron(){
        IO>>n>>q;
        rep(i,1,n-1)ans[i]=(ans[i-1]+qpow(i,n))%P;
    }
	void Shemesh(){
		while(q--){
			ll m;
			IO>>m;
			IO<<ans[m-1]<<'\n';
		}
	}
}// Metatron Shemesh 绝灭天使·日轮

Subtask 2

\[f_n=\sum_{k=0}^{n}k^n\frac{1}{(k+m+1)!}\frac{(-1)^{n-k-m}}{(n-k-m)!} \]

显然这里可以提一个组合数,两边乘以 \((n+1)!\) 可得

\[(n+1)!f_n=\sum_{k=0}^{n}k^n\binom{n+1}{k+m+1}(-1)^{n-k-m} \]

然后这个 \(k^n\)​ 显然要拿去配斯特林数,我们观察一下这个式子,然后来尝试强行凑一个。

\[\begin{Bmatrix}n\\m\end{Bmatrix}=\sum_k \frac{k^n(-1)^{m-k}}{k!(m-k)!} \]

那么组合数可以产生求和符号,首先可以把 \((-1)^{n-k-m}\) 拆成 \((-1)^{n-j-m}(-1)^{j-k}\),\(j\) 是外层求和枚举的变量,然后来考虑分母怎么动,这个时候就可以把斯特林数的式子改一下变成:

\[\begin{Bmatrix}n\\j\end{Bmatrix}=\sum_k \frac{k^n(-1)^{j-k}}{k!(j-k)!} \]

那么我们整一个 \(\dbinom{j}{k}\) 就可以搞出来了,下面考虑怎么把 \(\dbinom{n+1}{k+m+1}\) 搞成求和形式。

事实上根据生成函数容易证明:

\[\binom{n+1}{k+m+1}=\sum_{j}\binom{j}{k}\binom{n-j}{m} \]

然后带进去就可以得到我们想要的式子:

\[\begin{aligned} \sum_{k=0}^{n}k^n\binom{n+1}{k+m+1}(-1)^{n-k-m}&=\sum_{k=0}^{n}k^n(-1)^{n-k-m}\sum_{j}\binom{j}{k}\binom{n-j}{m}\\ &=\sum_{j}(-1)^{n-j-m}\binom{n-j}{m}\sum_{k=0}^{n}k^n(-1)^{j-k}\binom{j}{k}\\ &=\sum_{j}(-1)^{n-j-m}\binom{n-j}{m}j!\begin{Bmatrix}n\\j\end{Bmatrix} \end{aligned} \]

然后你就会发现和欧拉数的通项一完全一致,用通项二带进去可得

\[f_n=\frac{1}{(n+1)!}\sum_{k=0}^m\binom{n+1}{k}(m+1-k)^n(-1)^k \]

预计算幂和阶乘,单次 \(O(m)\)​ 即可。

复杂度 \(O(nm)-O(m)\)。

namespace Malakh{
	ll fac[N],invfac[N],pw[25][N];
	void Metatron(ll n,ll m){
		fac[0]=1;
		rep(i,1,n)fac[i]=fac[i-1]*i%P;
		invfac[n]=qpow(fac[n],P-2);
		Rep(i,n-1,0)invfac[i]=invfac[i+1]*(i+1)%P;
		rep(i,1,m){
			pw[i][0]=1;
			rep(j,1,n)pw[i][j]=pw[i][j-1]*i%P;
		}
	}
	ll C(ll n,ll m){return fac[n]*invfac[m]%P*invfac[n-m]%P;}
	void Malakh(){
		for(IO>>q;q--;){
			IO>>n>>m;
			ll ans=0;
			rep(k,0,m){
				if(k&1^1)ans=(ans+C(n+1,k)*pw[m+1-k][n]%P)%P;
				else ans=(ans+(P-C(n+1,k))*pw[m+1-k][n]%P)%P;
			}
			IO<<ans*invfac[n+1]%P<<'\n';
		}
	}
}//Metatron Mal'akh 绝灭天使·天翼

Subtask 5

因为 sub3 和 sub4 有点毁天灭地,所以先来讲 Sub5 了。

首先出题人显然把这玩意的 \(k+1\) 次幂强行拆开了,现在我们把它合起来,顺便把 \(k+1\) 转化成 \(k\)。

\[\begin{aligned} Ans&=\sum_{k=0}^{m}\sum_{i=0}^{m-k}\frac{\dbinom{2n+1}{i}(-1)^{m-k}(k+1)^{m+n+1-i}}{(m-k-i)!(k+1)!}\\ &=\sum_{k=1}^{m+1}\sum_{i=0}^{m-k+1}\frac{\dbinom{2n+1}{i}(-1)^{m-k}k^{m+n+1-i}}{(m-k+1-i)!k!}\\ \end{aligned} \]

继续考虑怎么化出斯特林数。

首先观测到 \(k=0\) 时,后面的式子也是 \(0\)​,所以可以把 \(k=0\) 扔进来。

天然的 \(\dfrac{k^{m+n+1-i}}{(m-k+1-i)!k!}\)​​​​ 肯定不要动,那么 \(i\)​​​​​​ 是固定的,考虑其余怎么配。

代入斯特林数的通项,我们可以发现:

\[\begin{Bmatrix}m+n+1-i\\m+1-i\end{Bmatrix}=\sum_k \frac{k^{m+n+1-i}(-1)^{m+1-k-i}}{k!(m-k+1-i)!} \]

直接拆 \((-1)^{m-k}\) 为 \((-1)^{m+1-k-i}(-1)^{i-1}\) 就可以了。

于是原式化为

\[\begin{aligned} Ans&=\sum_{k=0}^{m+1}\sum_{i=0}^{m-k+1}\frac{\dbinom{2n+1}{i}(-1)^{m-k}k^{m+n+1-i}}{(m-k+1-i)!k!}\\ &=\sum_{i=0}^{m}\sum_{k=0}^{m-i+1}\frac{\dbinom{2n+1}{i}(-1)^{m-k}k^{m+n+1-i}}{(m-k+1-i)!k!}\\ &=\sum_{i=0}^{m}\dbinom{2n+1}{i}(-1)^{i-1}\sum_{k=0}^{m-i+1}\frac{(-1)^{m+1-k-i}k^{m+n+1-i}}{(m-k+1-i)!k!}\\ &=\sum_{i=0}^{m}\dbinom{2n+1}{i}(-1)^{i-1}\begin{Bmatrix}n+k+1-i\\k+1-i\end{Bmatrix} \end{aligned} \]

注意到这正好是二阶欧拉数的通项,而注意到数据范围只有 \(2000\),所以可以通过递归式 \(n^2\) dp 求得。

复杂度为 \(O(n^2)-O(1)\) 的。

namespace Satan{
	ll Euler[2005][2005];
	void Devil(ll n){
		rep(i,0,n)Euler[i][0]=1;
		rep(i,1,n)rep(j,1,i)Euler[i][j]=((j+1)*Euler[i-1][j]%P+(2*i-1-j)*Euler[i-1][j-1])%P;
	}
	void Satan(){
		for(IO>>q;q--;){
			IO>>n>>m;
			IO<<Euler[n][m]<<'\n';
		}
	}
}//Satan 反转体 救世魔王

目前你可以得到 \(52\)​​ 分的高分。(我目前就写了这么多)

Subtask 3

相比 Subtask 2 而言,数据范围上升到了 \(998244352\)​​,考虑怎么优化预处理。

快速阶乘算法我不会,所以上分块打表。

为了防止快速幂被卡,所以上分块打表。

然后这个 sub 就没了。

Subtask 4

\[f_n=\sum_{k=0}^{n}k^n\frac{k^m}{k!}\frac{(-1)^{n-k}}{(n-k)!} \]

小 Q 对小 K 说:你这个菜鸡,这不显然的第二类斯特林数吗,你斯特林数怎么学的了。

然后他仔细看了一遍,

\[n\le 10^{10^5},m\le 10 \]

傻眼了,发现他不会这道题。

所以我们需要用 OEIS 来解决这道题!

根据 oeis 上 formula 板块列出的列 EGF,我们可以知道:

\[F_k(x)=\exp x\times \sum_{m=0}^{k-1}\operatorname{A112493}(k-1,m)\times \frac{x^{k-1+m}}{(k-1+m)!} \]

注意到 \(m\le 10\)​,我们可以考虑把 A112493 的前面几行根据定义式算出来(复杂度 \(O(m^3)\)​,如果你高兴可以打表),然后每次查询暴力计算就行了。

复杂度 \(O(m^3)-O(m)\),如果不采用打表。

后面 \(n\) 的范围过大,我们考虑使用边读入边取模的方式解决。

于是这道题就做完了。

上一篇:快用Django REST framework写写API吧


下一篇:A Quantization-Friendly Separable Convolution for MobileNets