【prufer编码+组合数学】BZOJ1005 [HNOI2008]明明的烦恼
Description
自从明明学了树的结构,就对奇怪的树产生了兴趣...... 给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树?
Solution
这道题就是树的计数加强版,多了不要求的情况。
对于已限制的情况,就是C(n-2,t)*可重复元素的公式,考虑其他不限制的元素,再*(n-t)^(n-2-sum),t为已限制点个数,sum为已限制度数。
大概就是这个意思,计算要用分解质因数+高精度,具体细节自己推一推。
Code
因为是高精乘低精,高精度很好打。
1A十分感动,感觉最近打代码没以前那么无脑了。
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=5e3+; int dy[maxn],pri[maxn],tot[maxn],cnt;
int a[maxn],d[maxn],n,t,len; int getpri(){
for(int i=;i<=n;i++){
if(!dy[i]) pri[++cnt]=i,dy[i]=cnt;
for(int j=;j<=cnt&&pri[j]*i<=n;j++){
dy[pri[j]*i]=j;
if(i%pri[j]==) break;
}
}
} int add(int x,int k){
while(x!=){
tot[dy[x]]+=k;
x/=pri[dy[x]];
}
} int mul(int x){
for(int i=;i<=len;i++) a[i]*=x;
for(int i=;i<=len;i++) if(a[i]>=){
if(i==len) len++;
a[i+]+=a[i]/;
a[i]%=;
}
} int main(){
int sum=;
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&d[i]);
if(d[i]!=-) sum+=d[i]-;
}
if(sum>n-){
printf("0\n");
return ;
}
if(n==){
printf("1\n");
return ;
} for(int i=;i<=n;i++){
if(!d[i]){
printf("0\n");
return ;
}
if(d[i]!=-) t++;
} getpri();
for(int i=;i<=n-;i++) add(i,);
for(int i=;i<=n--sum;i++) add(n-t,);
for(int i=;i<=n--sum;i++) add(i,-);
for(int i=;i<=n;i++)
for(int j=;j<d[i];j++) add(j,-); len=a[]=;
for(int i=;i<=cnt;i++)
for(int j=;j<=tot[i];j++) mul(pri[i]); for(int i=len;i>=;i--)
printf("%d",a[i]);
return ;
}
【prufer编码+组合数学】BZOJ1005 [HNOI2008]明明的烦恼的更多相关文章
- bzoj1005: [HNOI2008]明明的烦恼(prufer+高精度)
1005: [HNOI2008]明明的烦恼 题目:传送门 题解: 毒瘤题啊天~ 其实思考的过程还是比较简单的... 首先当然还是要了解好prufer序列的基本性质啦 那么和1211大体一致,主要还是利 ...
- bzoj1005 [HNOI2008]明明的烦恼
1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3032 Solved: 1209 Description ...
- [bzoj1005][HNOI2008]明明的烦恼-Prufer编码+高精度
Brief Description 给出标号为1到N的点,以及某些点最终的度数,允许在 任意两点间连线,可产生多少棵度数满足要求的树? Algorithm Design 结论题. 首先可以参考这篇文章 ...
- bzoj1005: [HNOI2008]明明的烦恼 prufer序列
https://www.lydsy.com/JudgeOnline/problem.php?id=1005 给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的 ...
- [BZOJ1005] [HNOI2008] 明明的烦恼 (prufer编码)
Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为N ...
- BZOJ1005:[HNOI2008]明明的烦恼(组合数学,Prufer)
Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为N ...
- BZOJ1005 HNOI2008明明的烦恼(prufer+高精度)
每个点的度数=prufer序列中的出现次数+1,所以即每次选一些位置放上某个点,答案即一堆组合数相乘.记一下每个因子的贡献分解一下质因数高精度乘起来即可. #include<iostream&g ...
- [bzoj1005][HNOI2008][明明的烦恼] (高精度+prufer定理)
Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为N ...
- [BZOJ1005][HNOI2008]明明的烦恼 数学+prufer序列+高精度
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int N; ...
随机推荐
- 1-bit and 2-bit Characters
We have two special characters. The first character can be represented by one bit 0. The second char ...
- 一个简单的例子搞懂ES6之Promise
ES5中实现异步的常见方式不外乎以下几种: 1. 回调函数 2. 事件驱动 2. 自定义事件(根本上原理同事件驱动相同) 而ES6中的Promise的出现就使得异步变得非常简单.promise中的异步 ...
- Open Source BI Platform List
资源入口: awesome-business-intelligence https://github.com/thenaturalist/awesome-business-intelligence h ...
- Android Java端的Socket.io-client
先讲讲历史,这个方面最早的应该是nkzawa@github的项目:http://mvnrepository.com/artifact/com.github.nkzawa/socket.io-clien ...
- ASP.NET Core Api网关Ocelot的中文文档
架构图 入门 不支持 配置 路由 请求聚合 GraphQL 服务发现 微服务ServiceFabric 认证 授权 Websockets 管理 流量控制 缓存 QoS服务质量 转换Headers 转换 ...
- java 操作Excel表格
对于Excel表格的解析.生成,java在 org.apache.poi 包中已经封装好了,使用比较简单. 解析Excel: 首先将File文件转成InputStream InputStream in ...
- 网站内容禁止复制和粘贴、另存为的js代码
1.使右键和复制失效 方法1: 在网页中加入以下代码: 复制代码代码如下: <script language="Javascript"> document.oncont ...
- java线程之线程通信控制
在上篇我们看到,A线程往公共资源库(对象)提供了一条数据,然后B线程从库中提取了数据并打印出来. 实际项目中,我们不可能只往库中提供一条数据,而且库的大小也不会是无穷大的,那么我们就会有这样一 个需求 ...
- js中几种实用的跨域方法原理详解【转】
源地址:http://www.cnblogs.com/2050/p/3191744.html 这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通 ...
- goroutine和线程区别
从调度上看,goroutine的调度开销远远小于线程调度开销. OS的线程由OS内核调度,每隔几毫秒,一个硬件时钟中断发到CPU,CPU调用一个调度器内核函数.这个函数暂停当前正在运行的线程,把他的寄 ...