传送门

解题思路

  \(prufer\)序,就是所有的不同的无根树,都可以转化为唯一的序列。做法就是每次从度数为\(1\)的点中选出一个字典序最小的,把这个点删掉,并把这个点相连的节点加入序列,直到只剩两个节点。然后这个东西有一个显然的性质就是所有点会在序列中出现这个点的度数\(-1\)次,这个性质有一个推论就是给你一棵树所有点的度数,你可以算出无根树不同形态的个数。公式为\(ans=\frac{(n-2)!}{\prod_{i=1}^{n}(deg[i]-1)!}\)。然后注意要质因数分解,否则中间会爆\(long long\),还要特判一些东西。

代码

#include<iostream>
#include<cstdio>
#include<cstring> using namespace std;
const int MAXN = 155;
typedef long long LL; inline int rd(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) {f=ch=='-'?0:1;ch=getchar();}
while(isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return f?x:-x;
} int n,deg[MAXN],num[MAXN],prime[MAXN],cnt,sum;
bool vis[MAXN];
LL ans=1; void solve(int x,int k){
for(int i=1;i<=cnt;i++){
while((x%prime[i]==0)) {num[i]+=k;x/=prime[i];}
if(x==1) break;
}
} int main(){
n=rd();
if(n==1) {puts(rd()==0?"1":"0");return 0;}
for(int i=1;i<=n;i++){
deg[i]=rd();sum+=deg[i];
if(!deg[i]) {puts("0");return 0;}
deg[i]--;
}
if(sum/2+1!=n) {puts("0");return 0;}
for(int i=2;i<=150;i++){
if(!vis[i]) {prime[++cnt]=i;vis[i]=1;}
for(int j=1;j<=cnt && i*prime[j]<=150;j++){
vis[i*prime[j]]=1;
if(!(i%prime[j])) break;
}
}
for(int i=2;i<=n-2;i++) solve(i,1);
for(int i=1;i<=n;i++){
if(deg[i]<=1) continue;
for(int j=2;j<=deg[i];j++) solve(j,-1);
}
for(int i=1;i<=cnt;i++)
while(num[i]--) ans*=prime[i];
printf("%lld\n",ans);
return 0;
}

LUOGU P2290 [HNOI2004]树的计数(组合数,prufer序)的更多相关文章

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

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

  2. P2290 [HNOI2004]树的计数

    P2290 [HNOI2004]树的计数prufer序列模板题 #include <iostream> #include <cstdio> #include <queue ...

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

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

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

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

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

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

  6. 洛谷 P2290 [HNOI2004]树的计数

    题目描述 输入输出格式 输入格式: 输入文件第一行是一个正整数n,表示树有n个结点.第二行有n个数,第i个数表示di,即树的第i个结点的度数.其中1<=n<=150,输入数据保证满足条件的 ...

  7. [BZOJ1211][HNOI2004]树的计数(Prufer序列)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1211 分析: 关于无根树的组合数学问题肯定想到Prufer序列,类似bzoj1005那 ...

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

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

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

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

随机推荐

  1. 22-8-filter

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. Android基础——框架模式MVC在安卓中的实践

    本篇文章包含以下内容: MVC的介绍 MVC的实践 MVC的介绍 MVC (Model View Controller),是模型(model)视图(view)控制器(controller)的缩写,一种 ...

  3. wbinfo - 向winbind服务查询信息

    总览 SYNOPSIS wbinfo [-a user%password] [-c username] [-C groupname] [--domain domain] [-I ip] [-s sid ...

  4. linux fcntl 对文件描述符控制

    linux fcntl 对文件描述符控制 linux fcntl 对文件描述符控制 linux fcntl 对文件描述符控制

  5. Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci...

    最近刚接触mysql,今天用mysql插入中文字符的时候,程序报错“Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_g ...

  6. Linux --赋予普通用户root 权限

    Linux的普通用户在安装一些东西的时候或者执行命令的时候,终端始终会提示权限不够,我们会将这个普通用户赋予root权限,但是,和root还是有区别的,因为只能执行root规定好的一些操作命令. 1. ...

  7. 使用 SpringBoot 配置发送邮件功能

    1.使用 SpringBoot 配置发送邮件功能 项目总体结构 用户表设计 SET FOREIGN_KEY_CHECKS=0; CREATE DATABASE sample; USE sample; ...

  8. photoshop钢笔工具简单记录

    1. 移动锚点 Ctrl + 左键 2. 增加.删除锚点 左键(显示+.-) 3. 直线曲线相互转换 Alt + 左键(注意提示) 默认情况下为直线,按住Alt鼠标左键点击目标锚点,目标锚点两边的直线 ...

  9. 【JZOJ6421】匹配

    description analysis 对于普通树形\(DP\)可以设\(f[i][0/1],g[i][0/1]\)表示\([1,i]\)的线段树的最大值.方案数 \(0\)表示不选择根与某个儿子相 ...

  10. Zookeeper_Paxos算法

    Paxos算法 算法简介 Paxos算法是莱斯利-兰伯特在1990年提出的一种基于消息传递的.具有容错性的一致性算法,Google Chubb(分布式锁服务)的作者Mike Burrwos说过,世上只 ...