普通幂转下降幂

更新日志 2025/10/27:开工。

概念

一个小 trick,利用第二类斯特林数将普通幂转化成下降幂。

思路

\[v^k=\sum_{i=0}^{\min(v,k)} {k\brace i}v^{\underline{i}}=\sum_{i=0}^{\min(v,k)}{k\brace i}\binom{v}{i}i! \]

在通常情况下貌似没什么用,但在特殊情境下可能很关键。比如下面这道例题。

可以考虑组合意义证明,\(k\) 个有标号球放入 \(v\) 个有标号箱子中,当然可以枚举共放入多少个箱子,然后选出每一组的球,然后任意放入箱子。

例题

Crash 的文明世界

发现组合数可以线性递推,并且递推 \(n-1\) 恰好方便了树上转移(固定根节点的话从儿子转移到父亲距离恰好 \(-1\)),于是直接换根 DP 即可。

代码
const int N=5e4+5,K=155;

int n,k;
vec<int> G[N];
mint f[N][K],g[N][K],ans[N];
mint fc[K],S[K][K];

void dfs1(int x,int fa){
	f[x][0]=1;
	for(auto y:G[x])if(y!=fa){
		dfs1(y,x);
		f[x][0]+=f[y][0];
		rep(i,1,k)f[x][i]+=f[y][i]+f[y][i-1];
	}
}
void dfs2(int x,int fa){
	if(fa){
		rep(i,0,k)g[fa][i]=f[fa][i];
		g[fa][0]-=f[x][0];
		rep(i,1,k)g[fa][i]-=f[x][i]+f[x][i-1];
		f[x][0]+=g[fa][0];
		rep(i,1,k)f[x][i]+=g[fa][i]+g[fa][i-1];
	}
	rep(i,1,k)ans[x]+=S[k][i]*fc[i]*f[x][i];
	for(auto y:G[x])if(y!=fa)dfs2(y,x);
}

inline void Main(){
	cin>>n>>k;
	S[0][0]=1;rep(i,1,k)rep(j,1,k)S[i][j]=S[i-1][j-1]+j*S[i-1][j];
	fc[0]=1;rep(i,1,k)fc[i]=fc[i-1]*i;
	repl(i,1,n){
		int a,b;cin>>a>>b;
		G[a].pub(b),G[b].pub(a);
	}
	dfs1(1,0);
	dfs2(1,0);
	rep(i,1,n)put(ans[i]);
}
posted @ 2025-10-27 17:13  LastKismet  阅读(2)  评论(0)    收藏  举报