题目大意:给定一棵n个节点的树的节点的度数。当中一些度数无限制,求能够生成多少种树

Prufer序列

把一棵树进行下面操作:

1.找到编号最小的叶节点。删除这个节点,然后与这个叶节点相连的点计入序列

2.重复进行1,直到这棵树仅仅剩下两个节点时,退出

比方说这个图(来自度受百科)

最小叶节点为2,删除2,将3计入序列

最小叶节点为4,删除4,将5计入序列

最小叶节点为5,删除5,将1计入序列

最小叶节点为1,删除1。将3计入序列

图中仅仅剩下两个节点,退出

于是得到这棵树的Prufer序列为{3,5,1,3}

这样能够得到一个长度为n-2的序列。非常easy证明,树和Prufer序列是一一相应的

Prufer序列显然满足一个性质:一个点若度数为d,则一定在Prufer序列中出现了d-1次

于是这就变成了一个排列组合的问题了

令每一个已知度数的节点的度数为di,有n个节点,m个节点未知度数。left=(n-2)-(d1-1)-(d2-1)-...-(dk-1)

已知度数的节点可能的组合方式例如以下

(n-2)!/(d1-1)!/(d2-1)!/.../(dk-1)!/left!

剩余left个位置由未知度数的节点任意填补,方案数为m^left

于是最后有

ans=(n-2)!/(d1-1)!/(d2-1)!/.../(dk-1)!/left! * m^left

答案非常显然有高精度。为了避免高精度除法我们能够对每一个阶乘暴力分解质因数,对指数进行加减操作就可以

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 1100
using namespace std;
typedef long long ll;
struct abcd{
ll xx[400];
int cnt;
abcd(int x=0)
{
memset(xx,0,sizeof xx);
xx[1]=x;
cnt=1;
}
ll& operator [] (int x)
{
return xx[x];
}
}ans(1);
abcd operator *= (abcd &x,abcd &y)
{
int i,j;
abcd z;
for(i=1;i<=x.cnt;i++)
for(j=1;j<=y.cnt;j++)
z[i+j-1]+=x[i]*y[j],z[i+j]+=z[i+j-1]/100000000,z[i+j-1]%=100000000;
z.cnt=x.cnt+y.cnt;
if(!z[z.cnt])
--z.cnt;
x=z;
}
ostream& operator << (ostream& os,abcd &x)
{
int i;
printf("%lld",x[x.cnt]);
for(i=x.cnt-1;i;i--)
printf("%08lld",x[i]);
return os;
}
int n,m,remain,cnt[M],stack[M],top;
void Decomposition(int x,int y)
{
int i;
for(i=2;i*i<=x;i++)
while(x%i==0)
cnt[i]+=y,x/=i;
if(x^1)
cnt[x]+=y;
}
void Quick_Power(int i,int y)
{
abcd x(i);
while(y)
{
if(y&1)ans*=x;
x*=x;
y>>=1;
}
}
int main()
{
int i,x;
cin>>n;remain=n-2;
for(i=1;i<=n;i++)
{
scanf("%d",&x);
if(x==-1)
++m;
else if(x>1)
stack[++top]=x-1,remain-=x-1;
}
for(i=2;i<=n-2;i++)
Decomposition(i,1);
while(top)
{
for(i=2;i<=stack[top];i++)
Decomposition(i,-1);
stack[top--]=0;
}
for(i=2;i<=remain;i++)
Decomposition(i,-1);
Decomposition(m,remain);
for(i=1;i<=n;i++)
if(cnt[i])
Quick_Power(i,cnt[i]);
cout<<ans<<endl;
}

BZOJ 1005 明明的烦恼 Prufer序列+组合数学+高精度的更多相关文章

  1. BZOJ 1005 明明的烦恼(prufer序列+高精度)

    有一种东西叫树的prufer序列,一个树的与一个prufer序列是一一对应的关系. 设有m个度数确定的点,这些点的度为dee[i],那么每个点在prufer序列中出现了dee[i]-1次. 由排列组合 ...

  2. BZOJ 1005 [HNOI2008]明明的烦恼 (Prufer编码 + 组合数学 + 高精度)

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

  3. [HNOI2008][bzoj 1005]明明的烦恼(prufer序列)

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

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

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

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

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

  6. BZOJ 1005 明明的烦恼 (组合数学)

    题解:n为树的节点数,d[ ]为各节点的度数,m为无限制度数的节点数. 则               所以要求在n-2大小的数组中插入tot各序号,共有种插法: 在tot各序号排列中,插第一个节点的 ...

  7. [BZOJ]1005 明明的烦恼(HNOI2008)

    BZOJ的第一页果然还是很多裸题啊,小C陆续划水屯些板子. Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间 ...

  8. BZOJ 1005 明明的烦恼

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

  9. bzoj 1005: [HNOI2008]明明的烦恼 prufer编号&&生成树计数

    1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2248  Solved: 898[Submit][Statu ...

随机推荐

  1. <Spring Cloud>入门五 hystrix

    1.服务熔断 1.1引入坐标 <dependency> <groupId>org.springframework.cloud</groupId> <artif ...

  2. ajax 实现订单商品数量的增减及订单的删除进行异步更新界面

    [转载]https://blog.csdn.net/luliuying_01/article/details/78177617?locationNum=8&fps=1 由于在做答辩项目,做到购 ...

  3. 常见的User-Agent

    User_Agent = ["Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_2 like Mac OS X; zh-cn) AppleWebKit/533. ...

  4. c++_方格填数(最新方法)

      方格填数 如下的10个格子 +--+--+--+ | | | |+--+--+--+--+| | | | |+--+--+--+--+| | | |+--+--+--+ (如果显示有问题,也可以参 ...

  5. 为何ARM linux会引入Device Tree(转)

    http://www.360doc.com/content/14/0522/20/14530056_380011180.shtml

  6. 前端基础之JavaScript_2

    摘要: window对象 BOM(Browser Object Model) DOM (Document Object Model) 0.引子: JavaScript分为三部分:ECMAScript. ...

  7. (一)Robot Framework安装

    准备工作: Python 2.7 (目前不能良好支持python3) pip 和 setuptools (Python 的套件管理程式,最新版的Python 2.7.16已包含) Robot Fram ...

  8. No unique bean of type..... Unsatisfied dependency of type

    比如在XXXServiceImpl里面写了aa()方法给别的地方调用 但是自己又调用了自己 在开头写了 @Autowired Private XXX xxx; xxx.aa(); 这样重复调用自己的b ...

  9. 大数据学习——Linux上常用软件安装

    4.1 Linux系统软件安装方式 Linux上的软件安装有以下几种常见方式: 1.二进制发布包 软件已经针对具体平台编译打包发布,只要解压,修改配置即可 2.RPM发布包 软件已经按照redhat的 ...

  10. Auto-Scaling Web Applications in Clouds: A Taxonomy and Survey读书笔记

    这篇文章是发在2018年CSUR上的一篇文章,主要是讲虚拟机上web应用的auto-scaling技术的分类 近年来许多web 应用服务商将他们的应用迁移到云数据中心,为什么要迁移到云上呢?其中一个重 ...