Hydro #4766. 文艺计算姬 题解--zhengjun
前置知识:Prufer 序列,二分图
别的题解都是直接给答案,没有比较易懂的思路。
首先,考虑 Prufer 序列,发现右边点删除一定会加入一个左边点,另一边类似。
且生成 Prufer 序列的最后一定会留下左右边各一个点。
所以左边点在 Prufer 序列中出现的次数即为 ,右边即为 。
所以这样看似乎有 种 Prufer 序列。
然而这样并不正确,因为会算重,例如:
和
它们的 Prufer 序列分别为 411
和 141
,但是,这两个实际上对应着同一张二分图。
这里的【二分图不同】指的是区分同侧的点,不区分两侧的点
本质上就是说,如何规定左右两边点的编号固定。
可以这样构造:
- 每次选个数多的一边,若两边个数一样就选和上次不一样的
- 找到这一边的最小叶子编号的节点删除
容易得到这样构造个数多的一边一定有叶子,且不同的方案对应不同的删除顺序。
反之,对于一个长度为 ,值域为 的序列 ,以及另一个序列 。
不妨认为 ,则先从 开始,计算度数,选出 中度数为 的最小编号节点与 连边,然后换到另一侧进行,最后剩下的两个点直接相连即可。
这样每个点仅有一个父亲,容易发现是一颗树,且不同的序列页对应着不同的树。
于是,可以建立起两者的双射。
故答案即为 。
代码
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
using big=__int128;
ll n,m,mod;
ll mul(ll x,ll y){
return (big)x*y%mod;
}
ll qpow(ll x,ll y){
ll ans=1;
for(;y;x=mul(x,x),y>>=1)if(y&1)ans=mul(ans,x);
return ans;
}
int main(){
cin>>n>>m>>mod;
cout<<mul(qpow(n,m-1),qpow(m,n-1));
return 0;
}
分类:
BZOJ
标签:
【技巧与思想】构造
, 【图论】Prufer 序列
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
2022-07-04 洛谷 P3224 [HNOI2012]永无乡 题解--zhengjun
2022-07-04 洛谷 P3605 [USACO17JAN]Promotion Counting P 题解--zhengjun
2022-07-04 CF335F Buy One, Get One Free 题解--zhengjun
2022-07-04 洛谷 P4197 Peaks & P7834 [ONTAK2010] Peaks 加强版 题解--zhengjun
2022-07-04 洛谷 P1646 [国家集训队]happiness / YbtOJ「图论」第3章 网络流模型及应用 C. 【例题3】幸福值 题解--zhengjun