普通幂转下降幂
更新日志
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\) 个有标号箱子中,当然可以枚举共放入多少个箱子,然后选出每一组的球,然后任意放入箱子。
例题
发现组合数可以线性递推,并且递推 \(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]);
}

浙公网安备 33010602011771号