BZOJ 4766 文艺计算姬

╄→尐↘猪︶ㄣ 提交于 2020-01-29 17:36:54

Link
考虑Prufer序列,最后剩下两个没删节点之间是有边相连的,所以一定位于二分图的两侧。
因为我们每次是删掉一个点然后将其连着的点加入Prufer序列,所以Prufer序列一定是\(n-1\)个右侧点和\(m-1\)个左侧点。
稍微模拟一下可以发现,当我们选定了Prufer序列中出现了哪些点之后,这棵生成树就已经完全确定了,换言之Prufer序列就只有一种排列方案。
因此总的方案是\(n^{m-1}m^{n-1}\)

#include<cstdio>
typedef long long i64;
i64 n,m,p;
i64 inc(i64 a,i64 b){return (a+b)%p;}
i64 mul(i64 a,i64 k){i64 r=0;for(;k;k>>=1,a=inc(a,a))if(k&1)r=inc(a,r);return r;}
i64 pow(i64 a,i64 k){i64 r=1;for(;k;k>>=1,a=mul(a,a))if(k&1)r=mul(a,r);return r;}
int main(){scanf("%lld%lld%lld",&n,&m,&p),printf("%lld",mul(pow(n,m-1),pow(m,n-1)));}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!