题解:P14254 分割(divide)
VinstaG173 · · 题解
首先发现如果
那么先固定
此时
因此我们知道对于
还有一种情况:所有
直接 dfs 求出
upd:我的实现用到了排序,所以是
Code:
int n,k,m;
int fa[1000003];
int dep[1000003];
int mxd[1000003];
ll ans;
int c[1000003];
vector<int>d[1000003];
inline void solve(){
cin>>n>>k;dep[1]=0;
for(int i=2;i<=n;++i)
cin>>fa[i];
for(int i=2;i<=n;++i)
dep[i]=dep[fa[i]]+1,m=max(m,dep[i]);
for(int i=n;i>1;--i)
mxd[i]=max(mxd[i],dep[i]),\
mxd[fa[i]]=max(mxd[fa[i]],mxd[i]);
for(int i=1;i<=n;++i)
++c[dep[i]],d[dep[i]].push_back(mxd[i]);
for(int i=0;i<=m;++i)
sort(d[i].begin(),d[i].end());
for(int i=0,l,r;i<=m;++i){
for(l=r=c[i]-1;r>=0;r=l){
while(l>=0&&d[i][l]==d[i][r])--l;
if(l>=c[i]-1-k)continue;
if(r-l==1)continue;
ans=(ans+(A(c[i]-2-l,k-1)-A(c[i]-1-r,k-1)+ntf)*(r-l))%ntf;
if(c[i]-1-r==k-1)
ans=(ans+fac[k-1]*(r-l))%ntf;
}
}cout<<ans<<"\n";
}