题解:P2624 [HNOI2008] 明明的烦恼

news/2025/9/17 19:22:04/文章来源:https://www.cnblogs.com/bennyt/p/19097388

题解:P2624 [HNOI2008] 明明的烦恼

不会 $prufer$ 序列的请右转树的计数,先将 $prufer$ 序列掌握再做这题。

设有 $n$ 个节点,$deg_i$ 为每个节点的度数,由上题可得,此时可能的无根树的方案为:

$$\frac{(n-2)!}{\prod_{i=1}^{n}(deg_i-1)!}$$

但是这题只给了我们部分节点的度数,要怎么办呢?

我们可以先算题目给定度数的节点对方案数的贡献,设 $sum$ 为有度数的节点的 $deg_i-1$ 总和,即为 $\sum_{i=1}^{n}(deg_i-1)$(不包括没有度数限制的节点),$sum$ 就是这些有度数限制的节点在这颗树的 $prufer$ 序列里占的长度,每个节点会在 $prufer$ 序列中出现 $deg_i-1$ 次

因为一颗有 $n$ 个节点的无根树的 $prufer$ 序列长度为 $n-2$,所以如果 $sum>n-2$ 则答案无解,否则方案数即为:

$$C_{n-2}{sum}\times\frac{sum!}{\sum_{i=1}(deg_i-1)!}$$

可以将 $C_{n-2}^{sum}$ 理解为将 $sum$ 个数放在长度为 $n-2$ 的 $prufer$ 中的方案数。

那么为什么是乘上 $\frac{sum!}{\sum_{i=1}^{n}(deg_i-1)!}$ 而不是 $\frac{(n-2)!}{\sum_{i=1}^{n}(deg_i-1)!}$ 呢?

让我们回忆一下 $prufer$ 序列的计算方法,因为这些数有 $sum$ 个,所以分子为 $sum$ 的全排列数,又因为每个节点会在 $prufer$ 序列中出现 $deg_i-1$ 次,所以要减去每种相同节点的全排列数。

那么剩下的部分怎么办呢?

可以发现剩下的 $prufer$ 序列没填的部分可以任意填没有限制度数的节点,剩下的 $prufer$ 序列没填的部分的长度为 $(n-2)-sum$(因为已经填了 $sum$ 个),设还没有度数限制的节点数为 $cnt$,则这部分的方案数即为 $cnt^{n-2-sum}$。

综上所述,最终答案的方案数即为:

$$C_{n-2}{sum}\times\frac{sum!}{\sum_{i=1}(deg_i-1)!}\times cnt^{n-2-sum}$$

化简后得:

$$\frac{A_{n-2}{sum}}{\sum_{i=1}(deg_i-1)!}\times cnt^{n-2-sum}$$

接下来写个高精度再写个质因数分解就完成了。

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int P=1e8;
int n,sum,d[1550],p[1010],pr[1010],pi,phi[1010]; 
void init(){//提前计算每个数的最小质因子 p[1]=1;for(int i=2;i<=1000;i++){if(!p[i]){pr[++pi]=i;phi[i]=i;}for(int j=1;j<=pi&&i*pr[j]<=1000;j++){p[i*pr[j]]=1;phi[i*pr[j]]=pr[j];if(i%pr[j]==0)break;}}
}
ll vis[1010];
struct N{//高精度 ll a[100010],l;N(){memset(a,0,sizeof(a));l=1;}
};
N operator*(N a,ll b){//高精乘 for(int i=1;i<=a.l;i++)a.a[i]*=b;for(int i=1;i<=a.l;i++){a.a[i+1]+=a.a[i]/P;a.a[i]%=P;if(a.l==i&&a.a[i+1])a.l++;}while(a.l>1&&a.a[a.l]==0)a.l--;return a;
}
N operator/(N a,ll b){//高精除 ll now=0;for(int i=a.l;i>=1;i--){now=now*10+a.a[i];a.a[i]=now/b;now%=b;}while(a.a[a.l]==0&&a.l>1)a.l--;return a;
}
void prr(N ans){//输出 cout<<ans.a[ans.l];for(int i=ans.l-1;i>=1;i--){int t=to_string(ans.a[i]).size();while(t<8){cout<<0;t++;}cout<<ans.a[i];}cout<<'\n';
}
void f(int x,int k){//质因数分解 while(x>1){vis[phi[x]]+=k;x/=phi[x];}
}
int main(){ios::sync_with_stdio(0);cin.tie(0);init();cin>>n;for(int i=1;i<=n;i++){cin>>d[i];if(d[i]!=-1)sum+=d[i]-1;}if(n==1){//特判n=1的情况 cout<<(d[1]<1);return 0;}if(sum>(n-2)){//如果sum>n-2则无解 cout<<0;return 0;}int cnt=n;N ans;ans.a[1]=1;ll aa=n-2,bb=sum;for(int i=aa-bb+1;i<=aa;i++){//计算A(n-2,sum) f(i,1);}for(int i=1;i<=n;i++){//计算相同点的全排列数 if(d[i]==-1)continue;cnt--;while(d[i]>1){f(d[i]-1,-1);d[i]--;}}for(int i=1;i<=n-sum-2;i++)f(cnt,1);//计算没有度数限制的点的放置方案数 for(int j=pi;j>=1;j--){//累计答案 while(vis[pr[j]]>0)ans=ans*pr[j],vis[pr[j]]--;}for(int j=pi;j>=1;j--){while(vis[pr[j]]>0)ans=ans/pr[j],vis[pr[j]]--;}prr(ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/906735.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在AI技术快速实现创想的时代,挖掘新需求成为核心竞争力——某知名DevOps学习平台需求洞察

该篇文章无摘要a.内容描述 该项目是一个结构化的DevOps学习资源,旨在帮助用户建立DevOps基础知识的系统化理解。核心功能定位是通过90天的学习计划,系统性地覆盖DevOps原则、流程和工具链的关键领域,包括DevOps基础、DevSecOps安全主题以及社区分享内容。 关键应用场景包括:…

Windows Powershell 获取版本version

前言全局说明一、 1.源码 $PSVersionTable.PSVersion2.结果免责声明:本号所涉及内容仅供安全研究与教学使用,如出现其他风险,后果自负。参考、来源: https://www.cnblogs.com/music-liang/p/18813922 作者:悟透原文链接:https://www.cnblogs.com/wutou/p/19097392来源:博…

XXL-JOB (1)

XXL-JOB (1)# 1 测试

公益站Agent Router注册送200刀额度竟然是真的

昨天看到说Agent Router邀请注册送100美刀,我就点了别人的链接,使用github注册了一个,确实得到了额度。但是我去聊天那里,发现会有错误,以为这个不好用:但是今天测试了一下在Claude Code确实能用,而且速度也还可以!!感兴趣的朋友也快来试试吧!! 邀请链接:https://a…

数据集中valid的作用

简单来说,valid(或 val)文件夹的存在是为了在模型训练过程中,定期、独立地评估模型的性能,以便进行模型调优、防止过拟合和选择最佳模型。它是机器学习工作流中至关重要的一环。 一般的数据集结构:1. Train(训练集)目的:这是模型“学习”所用的主要数据。模型通过反复…

深入 RocketMQ 核心源码:从环境搭建到高可用设计的全方位解析

深入 RocketMQ 核心源码:从环境搭建到高可用设计的全方位解析 在分布式系统中,消息队列是实现异步通信、解耦服务与削峰填谷的关键组件,而 RocketMQ 凭借其高吞吐、低延迟与高可用的特性,成为众多企业的首选。本文将从源码角度出发,带大家一步步揭开 RocketMQ 的神秘面纱,…

从零到顶会:NLP科研实战手册 - 实践

从零到顶会:NLP科研实战手册 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important;…

肝不好能喝酒吗

一般肝脏不好的患者不建议喝酒,可能会加重不适症状,影响健康。 肝脏是人体的重要器官,负责处理和代谢许多物质。如果肝脏不健康或受损,饮酒可能会产生负面影响,并导致一系列不适症状,甚至加重肝脏疾病。因此肝脏不好的人群不建议饮酒,以免对身体健康造成不良影响。 酒精…

ROS中如何将日志格式设置为行号的形式

export RCUTILS CONSOLE OUTPUT FORMAT=[{function name}:{line_number}]:{message}

USB相关的sysfs文件(重要的)【转】

https://www.cnblogs.com/linhaostudy/p/18388902 阅读目录前言 目录内容详解常见的 USB 相关目录及其含义1. /sys/bus/usb 目录下的含义1.1 /sys/bus/usb/devices/usb11-0:1.0 1-1.1:1.0结构图 设备信息bDeviceClass version busnum & devnum dev bMaxPower idVendor &…

25上第一周

《数学之美》第三章以“语言模型与中文信息处理”为核心,通过讲述统计语言模型如何破解中文分词、语音识别等难题,展示了数学在解决复杂问题时的优雅与力量。作者用“马尔可夫链”将看似无序的汉字序列转化为可计算的概率问题,这种化繁为简的思维令我得到了许多感悟。尤其当…

深入解析:RxJava在Android中的应用

深入解析:RxJava在Android中的应用pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; …

模型选择与配置说明

模型选择与配置说明(Detection / Recognition / Classification) 本文系统说明本项目在“检测(det)/识别(rec)/分类(cls)”三条子任务上的模型选择思路、备选方案对比、输入尺寸与性能取舍、部署格式(ONNX/MNN)、以及在 GUI 与代码层面的配置方式。目标是让读者理解“…

002_文本分类任务的问答

1、下面代码中,random_state作为随机种子作用是什么? train_x, valid_x, train_y, valid_y = model_selection.train_test_split(trainDF[text], trainDF[label], test_size=0.25, random_state=42)这段代码的作用是随机把数据分为两个部分 计算机的“随机数”其实是 伪随机数…

车牌识别

车牌识别方案对比与实现总结(GUI 三方法:lock / test / rec2) 本文面向实际工程应用,系统梳理当前 GUI 集成的三种车牌识别方法(lock、test、rec2)的技术亮点、设计思路、模型选择、实现过程与关键代码,帮助快速理解与持续优化。目标是:在统一界面中,对比“传统候选+文…

告别人工标注瓶颈!Reward-RAG:用 CriticGPT 打造更懂人类偏好的检索模型

Reward-RAG: Enhancing RAG with Reward Driven Supervision 全文摘要 本文介绍了一种名为Reward-RAG的新方法,旨在通过奖励驱动监督增强Retrieval-Augmented Generation(RAG)模型。与以往的RAG方法不同,该方法使用了CriticGPT训练了一个专门的奖励模型,并利用该模型生成合…

Latex 中百分号怎么打

Latex 中百分号怎么打 由于 % 被用作注释符,所以前面 + \ 进行转义 \(\frac{285.5}{1-2.7\%}\)

文件上传-条件竞争绕过

条件竞争原理: 条件竞争的逻辑是代码逻辑问题:当我们文件上传到服务器时,先对文件进行保存,然后对文件的后缀名进行判断,符合白名单的保存,不符合就删除,但在删除之前,有另一个对服务器发起的请求,要访问这个文件,那么就可能造成文件被读取和访问。这就是条件竞争。 …

9.17 CSP-S模拟23/多校A层冲刺NOIP2024模拟赛19 改题记录

HZOJ 写在前面 连着三天吃三坨。本来想着今天大凶忌参加模拟赛然后没模拟赛挺好的,然后7:57临时通知加场,难道这就是大凶?好吧打就打吧,没想到真差点爆零。粗看没一道题可做怀疑自己的水平了然后赛后猛然醒悟是自己蠢如猪。其实这篇前面应该还有两篇,但是奈何这套改完得比…

Java基本语法

Java基本语法Day04 今天内容大部分在复习运算符的内容和分支语句练习题 复习运算符: 运算符:+ - + - * / % (前)++ (后)++ (前)-- (后)-- + 算术运算符: 【特别说明的】 1.//(前)++ :先自增1,后运算 //(后)++ :先运算,后自增1 2.//(前)-- :先自减1,后运算 //(后)-- :先运算,…