更新日志
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!
\]
例题
Crash 的文明世界
代码
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]);
}