BZOJ1005的弱化版,不想写高精度就可以写这题嘿嘿嘿

  purfer编码如何生成?每次将字典序最小的叶子节点删去并将其相连的点加入序列中,直到树上剩下两个节点,所以一棵有n个节点的树purfer编码长度为n-2。

  purfer编码如何还原一棵树?从前往后扫purfer编码,每次找到不在编码中的没有被选择过的字典序最小的点,并将purfer编码第一个点与这个点连边并删去。

  purfer编码的性质?

  ①度数为d[i]的点在purfer编码中出现d[i]-1次。

  ②每一个purfer编码对应一棵唯一的树。

  知道了这些之后,我们就能大概有一个思路了,求多少棵树相当于求多少个purfer编码满足条件。

  第i个点度数为d[i],那么在purfer编码中出现d[i]-1次,编码的长度为n-2,于是总的方案数为:

  

  虽然答案不会爆long long但是计算过程会爆,于是必须分解质因数来写。

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=,inf=1e9;
int n,sum;
int cnt[maxn],d[maxn];
ll ans=;
void read(int &k)
{
int f=;k=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
void dec(int x,int y)
{
for(int i=;i*i<=x;i++)
while(x%i==)cnt[i]+=y,x/=i;
if(x^)cnt[x]+=y;
}
ll power(ll a,int b)
{
ll ans=;
while(b)
{
if(b&)ans*=a;
a*=a;
b>>=;
}
return ans;
}
int main()
{
read(n);
for(int i=;i<=n;i++)
{
read(d[i]);sum+=d[i]-;
if(!d[i]&&n!=)return puts(""),;
}
if(sum!=n-)return puts(""),;
for(int j=;j<=n-;j++)dec(j,);
for(int i=;i<=n;i++)
for(int j=;j<d[i];j++)
dec(j,-);
for(int i=;i<=n-;i++)
if(cnt[i])ans*=power(i,cnt[i]);
printf("%lld\n",ans);
return ;
}

bzoj1211: [HNOI2004]树的计数(purfer编码)的更多相关文章

  1. bzoj1211: [HNOI2004]树的计数 prufer编码

    题目链接 bzoj1211: [HNOI2004]树的计数 题解 prufer序 可重排列计数 代码 #include<bits/stdc++.h> using namespace std ...

  2. BZOJ1211: [HNOI2004]树的计数

    1211: [HNOI2004]树的计数 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1245  Solved: 383[Submit][Statu ...

  3. bzoj 1211: [HNOI2004]树的计数 -- purfer序列

    1211: [HNOI2004]树的计数 Time Limit: 10 Sec  Memory Limit: 162 MB Description 一个有n个结点的树,设它的结点分别为v1, v2, ...

  4. prufer BZOJ1211: [HNOI2004]树的计数

    以前做过几题..好久过去全忘了. 看来是要记一下... [prufer] n个点的无根树(点都是标号的,distinct)对应一个 长度n-2的数列 所以 n个点的无根树有n^(n-2)种 树 转 p ...

  5. bzoj1211: [HNOI2004]树的计数(prufer序列+组合数学)

    1211: [HNOI2004]树的计数 题目:传送门 题解: 今天刚学prufer序列,先打几道简单题 首先我们知道prufer序列和一颗无根树是一一对应的,那么对于任意一个节点,假设这个节点的度数 ...

  6. 【prufer编码】BZOJ1211 [HNOI2004]树的计数

    Description 给定一棵树每个节点度的限制为di,求有多少符合限制不同的树. Solution 发现prufer码和度数必然的联系 prufer码一个点出现次数为它的度数-1 我们依然可以把树 ...

  7. BZOJ1211:[HNOI2004]树的计数(组合数学,Prufer)

    Description 一个有n个结点的树,设它的结点分别为v1, v2, …, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵.给定n,d1, d2, …, dn,编程需要 ...

  8. bzoj1211: [HNOI2004]树的计数 prufer序列裸题

    一个有n个结点的树,设它的结点分别为v1, v2, …, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵.给定n,d1, d2, …, dn,编程需要输出满足d(vi)=di ...

  9. BZOJ1211: [HNOI2004]树的计数(prufer序列)

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2987  Solved: 1111[Submit][Status][Discuss] Descript ...

随机推荐

  1. Jmeter使用之:高效组织接口自动化用例技巧

    Jmeter怎么使用的文章多如牛毛,但怎么组织好测试用例,则几乎很难看到.在本文,我将把Jmeter下怎么组织测试用例的几点心得分享给大家,希望能给你一些帮助或启示. 1.善用“逻辑控制器”中的“简单 ...

  2. 现实世界中的 Python

    Python 有多稳定? 非常稳定. 自 1991 年起大约每隔 6 到 18 个月就会推出新的稳定发布版,这种状态看来还将持续下去. 目前主要发布版本的间隔通常为 18 个月左右. 开发者也会推出旧 ...

  3. C 判断成绩是否及格

    #include <stdio.h> int main(int argc, char **argv) { // 新建两个变量  pass代表及格分数的固定变量 score代表学生成绩的一个 ...

  4. Linux系统负载查询

    查询Linux系统负载情况,一般需要了解三个方面的信息: 1.Linux系统配置.如Linux版本号.CPU.内存.网络.磁盘等: 2.收集系统负载信息的手段.常用的工具包有sysstat和procp ...

  5. 简单说明hadoop集群运行三种模式和配置文件

    Hadoop的运行模式分为3种:本地运行模式,伪分布运行模式,集群运行模式,相应概念如下: 1.独立模式即本地运行模式(standalone或local mode)无需运行任何守护进程(daemon) ...

  6. linux c语言 fork() 和 exec 函数的简介和用法

    linux c语言 fork() 和 exec 函数的简介和用法   假如我们在编写1个c程序时想调用1个shell脚本或者执行1段 bash shell命令, 应该如何实现呢? 其实在<std ...

  7. Java微笔记(4)

    Java 中的内部类 内部类( Inner Class )就是定义在另外一个类里面的类.与之对应,包含内部类的类被称为外部类 内部类的主要作用如下: 内部类提供了更好的封装,可以把内部类隐藏在外部类之 ...

  8. 移动端调试和fiddler移动端抓包使用

    这里介绍一款移动端的调试工具以及抓包工具fiddler的使用.也是初次接触,算是初次接触的总结. 1,移动端调试工具.手机截图如下 代码实现 <!DOCTYPE html> <htm ...

  9. 原生js实现自定义alert风格和实现

    2018年6月29 最新更新 添加函数节流,解决多次点击问题,添加单例模式,提高代码性能. <!DOCTYPE html> <html lang="en"> ...

  10. 全面了解 Nginx 到底能做什么

    来源:https://www.jianshu.com/p/8bf73d1a758c 前言 本文只针对Nginx在不加载第三方模块的情况能处理哪些事情,由于第三方模块太多所以也介绍不完,当然本文本身也可 ...