Description

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

Input

第一行为N(0 < N < = 1000),接下来N行,第i+1行给出第i个节点的度数Di,如果对度数不要求,则输入-1

Output

一个整数,表示不同的满足要求的树的个数,无解输出0

Sample Input

3
1
-1
-1

Sample Output

2

HINT

两棵树分别为1-2-3;1-3-2

分析

好久没有更新题解了。。。

很容易看出这是一道组合计数题。然而……如果没有图论基础是很难想出怎样构造的。。。不过我在今年四月份刚“入门”OI的时候有幸看到了省队RealCS的题解,提前接触到了带标号无根树计数的“prufer数列“>_<所以这次很快就写出了正解~(prufer数列详见Matrix67 的blog:http://www.matrix67.com/blog/archives/682)

首先,由prufer数列的性质我们知道:对于一棵给定的无根树,任意一个节点在这棵树的prufer数列中出现次数等于这个节点的度数 - 1。那么根据题目中的条件,我们就可以得到一个可重集排列问题:给定每个数字出现次数,求满足条件的排列个数。对于没有给定度数的节点,我们可以将它们用空格代替。我们需要在已有的数列中插入若干个空格,每个空格中填入任意一个“没有给定度数”的节点。这样,我们只需将得出的“可重集排列”数乘上空格数量的cnt次方(此处cnt表示没有给定度数的节点种数)即可。

那么,基本的思路确定了,我们现在的问题就是如何高效地计算可重集排列数了。根据可重集全排列公式,

$$P = \frac{N!}{\prod{n_i !}} $$其中$n_i$表示第i个元素的个数。麻烦的是,本题中全集规模N可能很大,这里的所有数都应当是高精度表示的,我们难道要一点一点做高精度除法吗?

作为一名强迫症患者,我无法容忍这样龟速的解法,我们需要想想怎样优化。首先,我们知道这个公式得出的一定是整数。不难想到我们可以对分子分母分别做质因数分解,再将上下得到的指数相减,最后统一乘入一个高精度整数即可。又考虑到这里分解的对象比较特殊(都是阶乘),我们可以找到一种更机智的分解方法:从小到大枚举素数,然后统计这个素数在2~n的每个整数中的指数之和即可。(详见代码中的"res"函数)

;
, c = getchar();
 + c - ;
, A[] = ;}
;
;i < len || mor;++i){
, A[maxn], Acnt = , Bcnt = , prime[maxn], pcnt = ;
};
;i <= N;++i){
;j < pcnt;++j){
;
)){putchar();}
){
 || !d)putchar();
;i <= N;++i){
){putchar();}
) ++Bcnt;
;
;
) || (S < N- && !Bcnt)){
);
 - S;
;
};
;i < pcnt;++i){
){printf();}
, p;
] = ;
;i <= A[j];++i)
;i < pcnt;++i){
                      powcnt[i] += S / p;
             p *= prime[i];
         }
     }
     ;i < Acnt;++i)
         res(A[i]);
     ;i < pcnt;++i){
         ;j <= powcnt[i];++j)
             ans *= prime[i];
     }
     i = ans.len - ;
     printf(              printf( }
      init();
     work();
     ;
 }

Prufer数列+可重集排列+阶乘质因数分解

[BZOJ1005](HNOI 2008)明明的烦恼的更多相关文章

  1. [bzoj 1005][HNOI 2008]明明的烦恼(prufer数列+排列组合)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1005 分析: 首先prufer数列:http://baike.baidu.com/view/1 ...

  2. 【BZOJ1005】[HNOI2008]明明的烦恼(prufer序列)

    [BZOJ1005][HNOI2008]明明的烦恼(prufer序列) 题面 BZOJ 洛谷 题解 戳这里 #include<iostream> #include<cstdio> ...

  3. 「BZOJ1005」[HNOI2008] 明明的烦恼

    「BZOJ1005」[HNOI2008] 明明的烦恼 先放几个prufer序列的结论: Prufer序列是一种对有标号无根树的编码,长度为节点数-2. 具体存在无根树转化为prufer序列和prufe ...

  4. 【bzoj1005】[HNOI2008]明明的烦恼

    1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4175  Solved: 1660[Submit][Stat ...

  5. 【bzoj1005】 HNOI2008—明明的烦恼

    http://www.lydsy.com/JudgeOnline/problem.php?id=1005 (题目链接) 题意 给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多 ...

  6. 【bzoj1005】[HNOI2008]明明的烦恼 Prufer序列+高精度

    题目描述 给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? 输入 第一行为N(0 < N < = 1000),接下来N行,第i+1行给出第i ...

  7. 【BZOJ1005/1211】[HNOI2008]明明的烦恼/[HNOI2004]树的计数 Prufer序列+高精度

    [BZOJ1005][HNOI2008]明明的烦恼 Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可 ...

  8. bzoj1005 [HNOI2008]明明的烦恼

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

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

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

随机推荐

  1. 2017ACM暑期多校联合训练 - Team 6 1002 HDU 6097 Mindis (数学)

    题目链接 Problem Description The center coordinate of the circle C is O, the coordinate of O is (0,0) , ...

  2. 大聊PYthon----生成器

    再说迭代器与生成器之前,先说一说列表生成式 列表生成式 什么是列表生成式呢? 这个非常简单! 先看看普通青年版的! >>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, ...

  3. bootstrap分页查询传递中文参数到后台(get方式提交)

    <!--分页 --> <div style="width: 380px; margin: 0 auto; margin-top: 50px;"> <u ...

  4. Vuex-Mutation

    更改 Vuex 的 store 中的状态的唯一方法是提交 mutation.Vuex 中的 mutation 非常类似于事件:每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 ...

  5. MySQL5.6.26升级到MySQL5.7.9实战方案【转】

    MySQL5.6.26升级到MySQL5.7.9实战方案 转自 MySQL5.6.26升级到MySQL5.7.9实战方案 - 其他网络技术 - 红黑联盟http://www.2cto.com/net/ ...

  6. 判断Selenium加载完成

    How do you make Selenium 2.0 wait for the page to load? You can also check pageloaded using followin ...

  7. 使用xbee连接地面站和飞控

    Zigbee是一种短距离.低功耗的近距离无线组网通讯技术,主要适用于自动控制和远程控制领域,可以嵌入各种设备. DIGI的ZigBee产品XBee小型但却是一个功能完善的ZigBee收发器(即接收器/ ...

  8. java在图片上写字

  9. scrapy shell 用法(慢慢更新...)

    scrapy shell 命令 1.scrapy shell url #url指你所需要爬的网址 2.有些网址数据的爬取需要user-agent,scrapy shell中可以直接添加头文件, 第①种 ...

  10. 如何在Cent OS上安装和部署jdk与tomcat?

    Cent OS是一款Linux系统.在商业应用中,Linux操作系统在服务器市场有着广泛的运用,这源于Linux系统的几大优点: 1.跨平台的硬件支持 由于Linux 的内核大部分是用C 语言编写的, ...