[bzoj1211][prufer序列]树的计数

2023-10-16 04:18
文章标签 计数 序列 prufer bzoj1211

本文主要是介绍[bzoj1211][prufer序列]树的计数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description

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

Input

第一行是一个正整数n,表示树有n个结点。第二行有n个数,第i个数表示di,即树的第i个结点的度数。其中1<=n<=150,输入数据保证满足条件的树不超过10^17个。

Output

输出满足条件的树有多少棵。

Sample Input

4
2 1 2 1

Sample Output

2

题解

新东西,prufer序列
1:一个prufer序列唯一对应一个无根树
2:n个节点的无根树唯一对应了一个n-2的prufer序列
3:一个节点的度数-1等于他在这个prufer序列中出现的次数,反之亦然
4:n个节点的无根树共有n^(n-2)个
这道题只是用了第三个性质,第四个其实没有用到。。
可以想到,给出的度数d[i]-1的sigma就是这个prufer序列的长度。那么不考虑重复的情况下,这个prufer序列的全排列就是(n-2)!
考虑重复,一个节点在这个prufer序列中出现的是d[i]-1次,那么应该对于每个节点,都除以d[i]-1,d[i]=1的情况不需要处理
记得特判n=1,度数为0这些情况。
虽然说结果不会爆long long,但是中间会爆,所以质因数分解吧

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
LL pri[150];int t;
LL n,d[210],sum;
LL s[150],pr[150];
bool pd(int x)
{if(x==1)return false;int t=int(double(sqrt(x+1)));for(int i=2;i<=t;i++)if(x%i==0)return false;return true;
}
void get_pri(LL a)
{int p=1;memset(pr,0,sizeof(pr));while(a>1){while(a%pri[p]==0){a/=pri[p];pr[p]++;}p++;if(p>t)break;}
}
int main()
{scanf("%lld",&n);sum=0;for(int i=1;i<=n;i++){scanf("%lld",&d[i]);sum+=d[i]-1;if(n>1 && d[i]==0){printf("0\n");return 0;}}if(n==1 && d[1]!=0){printf("0\n");return 0;}if(sum!=n-2){printf("0\n");return 0;}memset(s,0,sizeof(s));t=0;for(int i=1;i<=150;i++)if(pd(i))pri[++t]=i;for(int i=1;i<=n-2;i++){get_pri(i);for(int i=1;i<=t;i++)s[i]+=pr[i];}for(int i=1;i<=n;i++){if(d[i]==1)continue;get_pri(d[i]-1);for(int i=1;i<=t;i++)s[i]-=pr[i];}LL ans=1;for(int i=1;i<=t;i++){for(int j=1;j<=s[i];j++)ans*=pri[j];}printf("%lld\n",ans);return 0;
}

这篇关于[bzoj1211][prufer序列]树的计数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/218972

相关文章

uva 10131 最长子序列

题意: 给大象的体重和智商,求体重按从大到小,智商从高到低的最长子序列,并输出路径。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vect

POJ1631最长单调递增子序列

最长单调递增子序列 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.StringTokenizer;publ

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

day-50 求出最长好子序列 I

思路 二维dp,dp[i][h]表示nums[i] 结尾,且有不超过 h 个下标满足条件的最长好子序列的长度(0<=h<=k),二维数组dp初始值全为1 解题过程 状态转换方程: 1.nums[i]==nums[j],dp[i,h]=Math.max(dp[i,h],dp[j,h]+1) 2.nums[i]!=nums[j],dp[i,h]=Math.max(dp[i,h],dp[j,h-1

LeetCode:3177. 求出最长好子序列 II 哈希表+动态规划实现n*k时间复杂度

3177. 求出最长好子序列 II 题目链接 题目描述 给你一个整数数组 nums 和一个非负整数k 。如果一个整数序列 seq 满足在下标范围 [0, seq.length - 2] 中 最多只有 k 个下标i满足 seq[i] != seq[i + 1] ,那么我们称这个整数序列为好序列。请你返回 nums中好子序列的最长长度。 实例1: 输入:nums = [1,2,1,1,3],

用Python实现时间序列模型实战——Day 14: 向量自回归模型 (VAR) 与向量误差修正模型 (VECM)

一、学习内容 1. 向量自回归模型 (VAR) 的基本概念与应用 向量自回归模型 (VAR) 是多元时间序列分析中的一种模型,用于捕捉多个变量之间的相互依赖关系。与单变量自回归模型不同,VAR 模型将多个时间序列作为向量输入,同时对这些变量进行回归分析。 VAR 模型的一般形式为: 其中: ​ 是时间  的变量向量。 是常数向量。​ 是每个时间滞后的回归系数矩阵。​ 是误差项向量,假

YOLOv8/v10+DeepSORT多目标车辆跟踪(车辆检测/跟踪/车辆计数/测速/禁停区域/绘制进出线/绘制禁停区域/车道车辆统计)

01:YOLOv8 + DeepSort 车辆跟踪 该项目利用YOLOv8作为目标检测模型,DeepSort用于多目标跟踪。YOLOv8负责从视频帧中检测出车辆的位置,而DeepSort则负责关联这些检测结果,从而实现车辆的持续跟踪。这种组合使得系统能够在视频流中准确地识别并跟随特定车辆。 02:YOLOv8 + DeepSort 车辆跟踪 + 任意绘制进出线 在此基础上增加了用户

时间序列|change point detection

change point detection 被称为变点检测,其基本定义是在一个序列或过程中,当某个统计特性(分布类型、分布参数)在某时间点受系统性因素而非偶然因素影响发生变化,我们就称该时间点为变点。变点识别即利用统计量或统计方法或机器学习方法将该变点位置估计出来。 Change Point Detection的类型 online 指连续观察某一随机过程,监测到变点时停止检验,不运用到

Leetcode面试经典150题-128.最长连续序列-递归版本另解

之前写过一篇这个题的,但是可能代码比较复杂,这回来个简洁版的,这个是递归版本 可以看看之前的版本,两个版本面试用哪个都保过 解法都在代码里,不懂就留言或者私信 class Solution {/**对于之前的解法,我现在提供一共更优的解,但是这种可能会比较难懂一些(思想方面)代码其实是很简洁的,总体思想如下:不需要排序直接把所有数放入map,map的key是当前数字,value是当前数开始的

go json反序列化成指定类型

简介 简单的介绍一下使用go的json库,将json字符串反序列化成接口中指定的实现类 代码如下 package usejsontype ExamInterface interface {CheckRule(data any) bool}type IntStru struct {DefalutVal int `json:"defalut_val"`Max int `json: