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]明明的烦恼的更多相关文章

  1. bzoj1005: [HNOI2008]明明的烦恼(prufer+高精度)

    1005: [HNOI2008]明明的烦恼 题目:传送门 题解: 毒瘤题啊天~ 其实思考的过程还是比较简单的... 首先当然还是要了解好prufer序列的基本性质啦 那么和1211大体一致,主要还是利 ...

  2. bzoj1005 [HNOI2008]明明的烦恼

    1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3032  Solved: 1209 Description ...

  3. [bzoj1005][HNOI2008]明明的烦恼-Prufer编码+高精度

    Brief Description 给出标号为1到N的点,以及某些点最终的度数,允许在 任意两点间连线,可产生多少棵度数满足要求的树? Algorithm Design 结论题. 首先可以参考这篇文章 ...

  4. bzoj1005: [HNOI2008]明明的烦恼 prufer序列

    https://www.lydsy.com/JudgeOnline/problem.php?id=1005 给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的 ...

  5. [BZOJ1005] [HNOI2008] 明明的烦恼 (prufer编码)

    Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为N ...

  6. BZOJ1005:[HNOI2008]明明的烦恼(组合数学,Prufer)

    Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为N ...

  7. BZOJ1005 HNOI2008明明的烦恼(prufer+高精度)

    每个点的度数=prufer序列中的出现次数+1,所以即每次选一些位置放上某个点,答案即一堆组合数相乘.记一下每个因子的贡献分解一下质因数高精度乘起来即可. #include<iostream&g ...

  8. [bzoj1005][HNOI2008][明明的烦恼] (高精度+prufer定理)

    Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为N ...

  9. [BZOJ1005][HNOI2008]明明的烦恼 数学+prufer序列+高精度

    #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int N; ...

随机推荐

  1. db2字段修改

    db2表字段修改 1:删除字段非空属性alter table XXX alter column XXX drop not null 2:添加字段非空属性alter table XXX alter co ...

  2. G1 GC技术解析

    介绍 G1 GC,全称Garbage-First Garbage Collector,通过-XX:+UseG1GC参数来启用.G1收集器是工作在堆内不同分区上的收集器,分区既可以是年轻代也可以是老年代 ...

  3. 查询linux机器的公网ip

    在linux终端提示符下,输入以下命令: curl members.3322.org/dyndns/getip 可以看到下图已经查询到公网IP地址了,就是这么简单

  4. innobackupex 简单使用笔记

    innobackupex 选项介绍 --backup 备份 --apply-log   应用日志 --move-back  --copy-back 恢复 --export 只导出单个表.前提是使用in ...

  5. springMVC中添加restful 风格

    RESTful架构:是一种设计的风格,并不是标准,只是提供了一组设计原则和约束条件,也是目前比较流行的一种互联网软件架构.它结构清晰.符合标准.易于理解.扩展方便,所以正得到越来越多网站的采用. 关于 ...

  6. DjangoRestFramework的外键反向关系序列化的一个问题

    先用文档中的样例: Models定义: class Album(models.Model): album_name = models.CharField(max_length=100) artist ...

  7. CSS弹性盒子的基本用法

    .container { width: 302px; height: 302px; border: 1px solid; display: flex } .item { width: 100px; h ...

  8. python捕获异常、处理异常

    https://blog.csdn.net/jmilk/article/details/50047457

  9. Linux下的磁盘分区和逻辑卷

    一.硬盘接口类型 硬盘的接口主要有IDE.SATA.SCSI .SAS和光纤通道等五种类型.其中IDE和SATA接口硬盘多用于家用产品中,也有部分应用于服务器,SATA是一种新生的硬盘接口类型,已经取 ...

  10. Ubuntu 16.04 安装 Docker

    在Ubuntu上安装Docker, 非常简单, 我测试过 16.04, 17.04, 以及最新版 18.04,都是可以成功安装,并使用的. 第一步:  启动root账号 第二步:  配置网络,能上网 ...