题目大意:

告诉你树上每个节点的度数,让你构建出这样一棵树,问能够构建出树的种树

这里注意数量为0的情况,就是

当 n=1时,节点度数>0

n>1时,所有节点度数相加-n!=n-2 可以通过通过除了根,必然有n-1个节点作为上一个节点的儿子来理解

然后通过学习prufer序列可知

每一颗树都能够建成唯一的序列,这里的n-2个数就是任意插入到prufer序列中,这很明显就是一个排列,那么之后就是计算

ans = (n-2)!/(w[1]!*w[2]!..w[n]!) w[i]表示i节点上的度数减1,或者理解为以最大的点n作为根,i有多少个儿子节点。

这里不取模,防止值溢出,要分解质因数

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
using namespace std;
#define pii pair<int,int>
int n , w[] , num[];
vector<pii> v[]; void solve(int m)
{
if(m==) return;
int tmp = m;
for(int i= ; i<=m ; i++){
if(m%i==){
int cnt = ;
while(m%i==){
m/=i;
cnt++;
}
v[tmp].push_back(make_pair(i , cnt));
}
}
if(m>) v[tmp].push_back(make_pair(m , ));
// for(int i=0 ; i<v[tmp].size() ; i++) cout<<v[tmp][i].first<<" "<<v[tmp][i].second<<endl;
}
void init()
{
for(int i= ; i<= ; i++) solve(i);
}
void update(int k , int flag)
{
for(int i= ; i<v[k].size() ; i++){
pii u=v[k][i];
num[u.first]+=u.second*flag;
}
}
void mul(long long &ans , int k , int tim)
{
for(int i= ; i<=tim ; i++) ans=ans*k;
}
int main()
{
// freopen("Sweet.in" , "r" , stdin);
init();
while(~scanf("%d" , &n)){
memset(num , , sizeof(num));
int sum= , flag=true;
for(int i= ; i<=n ; i++){
scanf("%d" , &w[i]);
if(n!= && w[i]<) flag=false;
if(n== && w[i]!=) flag=false;
w[i]--;
sum+=w[i];
for(int j= ; j<=w[i] ; j++) update(j , -);
}
if((n>&&sum!=n-) || flag==false){
cout<<<<endl;
continue;
}
for(int i= ; i<=n- ; i++) update(i , );
long long ans = ;
for(int i= ; i<=n- ; i++){
if(num[i]) mul(ans , i , num[i]);
}
cout<<ans<<endl;
}
return ;
}

bzoj1211: prufer序列 | [HNOI2004]树的计数的更多相关文章

  1. Prufer序列与树的计数(坑)

    \(prufer\)序列: 无根树转\(prufer\)序列: 不断找编号最小的叶子节点,删掉并在序列中加入他相连的节点. \(prufer\)转无根树: 找到在目前\(prufer\)序列中未出现且 ...

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

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

  3. 【BZOJ 1211】 1211: [HNOI2004]树的计数 (prufer序列、计数)

    1211: [HNOI2004]树的计数 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2468  Solved: 868 Description 一 ...

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

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

  5. Luogu P2290 [HNOI2004]树的计数 Prufer序列+组合数

    最近碰了$prufer$ 序列和组合数..于是老师留了一道题:P2624 [HNOI2008]明明的烦恼 qwq要用高精... 于是我们有了弱化版:P2290 [HNOI2004]树的计数(考一样的可 ...

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

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

  7. BZOJ1211: [HNOI2004]树的计数

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

  8. P2290 [HNOI2004]树的计数(bzoj1211)

    洛谷P2290 [HNOI2004]树的计数 bzoj1211 [HNOI2004]树的计数 Description 一个有\(n\)个结点的树,设它的结点分别为\(v_1,v_2,\cdots, v ...

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

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

随机推荐

  1. Prism 5 + MEF中的ModuleCatalog.CreateFromXaml问题

    protected override IModuleCatalog CreateModuleCatalog() { return Microsoft.Practices.Prism.Modularit ...

  2. python学习笔记系列----(一)python简介

    一个月前,就按下决心要系统的学习下python了,虽然之前有学习过java,学习过c++,也能较为熟练的使用java做自动化测试看懂c++里的业务逻辑,但是实际上有那么多的东西自己还是不清楚,今天下定 ...

  3. 助手系列之连接mysql数据库

    import MySQLdbdef main(): try: conn=MySQLdb.connect(host='127.0.0.1',user='root',passwd='pass',db='a ...

  4. Elasticsearch(入门篇)——Query DSL与查询行为

    ES提供了丰富多彩的查询接口,可以满足各种各样的查询要求.更多内容请参考:ELK修炼之道 Query DSL结构化查询 Query DSL是一个Java开源框架用于构建类型安全的SQL查询语句.采用A ...

  5. 五、Standard Controllers

    1.standardController:标准的controller 是同页面的standard Object的界面button的功能和逻辑是一样的<apex:page standardCont ...

  6. TBB 学习笔记

    #include <tbb/task_scheduler_init.h> #include <tbb/blocked_range.h> #include <tbb/par ...

  7. C#预处理器指令

    在C#中有许多名为“预处理指令”的命令,这些命令从来不会转化为可执行代码中的命令,但会影响编译过程的各个方面.例如,使用预处理器指令可以禁止编译器编译代码的某一部分.如果计划发布两个版本的代码,即基本 ...

  8. 视频 之自定义VideoView

    package com.lvshandian.partylive.view;import android.content.Context;import android.util.AttributeSe ...

  9. php多维数组去除空元素

    在php中去除数组中的空值可以使用array_filter() 这个函数 但是这个函数只能对一维数组起作用,一旦需要对多维数组去空就不行了,而且去除的空也包括(int)0,(string)0,使用起来 ...

  10. java中正则表达式基本用法

    正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式,它 用以描述在查找文字主体时待匹配的一个或多个字符串.正则表达式作为 ...