bzoj 1005 1211 prufer序列总结
两道题目大意都是根据每个点的度数来构建一棵无根树来确定有多少种构建方法
这里构建无根树要用到的是prufer序列的知识
先很无耻地抄袭了一段百度百科中的prufer序列的知识:
将树转化成Prufer数列的方法
Prufer数列以右边的树为例子,首先在所有叶子节点中编号最小的点是2,和它相邻的点的编号是3,将3加入序列并删除编号为2的点。接下来删除的点是4,5被加入序列,然后删除5,1被加入序列,1被删除,3被加入序列,此时原图仅剩两个点(即3和6),Prufer序列构建完成,为{3,5,1,3}
将Prufer数列转化成树的方法
#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(w[i]==) flag = false;
sum+=w[i]-;
for(int j= ; j<=w[i]- ; j++) update(j , -);
}
if(n== && w[]==){
cout<<<<endl;
continue;
}
if(sum!=n- || 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
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define N 1005
int n , a[N] , cnt[N];
int ans[N*] , l1;
int mul[N] , l2;
int tmp[N*]; void fenjie(int x , int flag)
{
for(int i= ; i*i<=x ; i++){
while(x%i==){
cnt[i]+=flag;
x/=i;
}
}
if(x>) cnt[x]+=flag;
} void solveC(int a , int b) //C(n-2 , sum)
{
for(int i= ; i<=b ; i++) fenjie(i , -);
for(int i=a ; i>a-b ; i--) fenjie(i , );
} void change(int x)
{
l2 = ;
while(x){
mul[l2++] = x%;
x/=;
}
} void cal()
{
memset(tmp , , sizeof(tmp));
int len = ;
for(int i= ; i<l2 ; i++){
for(int j= ; j<l1 ; j++){
int cur = i+j;
len = max(len , cur+);
tmp[cur] += ans[j]*mul[i];
}
}
for(int i= ; i<len ; i++){
if(tmp[i]>=){
len= max(len , i+);
tmp[i+] += tmp[i]/;
tmp[i] %= ;
}
}
for(int i= ; i<len ; i++) ans[i] = tmp[i] , l1 = len;
} void print()
{
for(int i=l1- ; i>= ; i--) printf("%d" , ans[i]);
printf("\n");
}
int main()
{
// freopen("a.in" , "r" , stdin);
while(~scanf("%d" , &n)){
memset(cnt , , sizeof(cnt));
int w = , sum = ;
bool flag = true;
for(int i= ; i<=n ; i++){
scanf("%d" , &a[i]);
if(a[i]==) flag=false;
if(a[i]<) w++;
else{
sum+=a[i]-;
for(int j= ; j<=a[i]- ; j++) fenjie(j , -);
}
}
if(n== && a[]==){
cout<<<<endl;
continue;
}
solveC(n- , sum);
if(n== || sum>n- || flag==false) cout<<<<endl;
else{
for(int i= ; i<=sum ; i++) fenjie(i, );
int cnt = n--sum;
for(int i= ; i<=cnt ; i++) fenjie(w , );
}
// for(int i=1 ; i<=10 ; i++) cnt[i]++;
ans[] = , l1=;
for(int i= ; i<=n ; i++){
if(cnt[i]){
change(i);
for(int j= ; j<=cnt[i] ; j++){
cal();
}
}
}
print();
}
return ;
}
bzoj1005
bzoj 1005 1211 prufer序列总结的更多相关文章
- [HNOI2004]树的计数 BZOJ 1211 prufer序列
题目描述 输入输出格式 输入格式: 输入文件第一行是一个正整数n,表示树有n个结点.第二行有n个数,第i个数表示di,即树的第i个结点的度数.其中1<=n<=150,输入数据保证满足条件的 ...
- [BZOJ1005][HNOI2008]明明的烦恼 数学+prufer序列+高精度
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int N; ...
- 【BZOJ 1211】 1211: [HNOI2004]树的计数 (prufer序列、计数)
1211: [HNOI2004]树的计数 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2468 Solved: 868 Description 一 ...
- [HNOI2008][bzoj 1005]明明的烦恼(prufer序列)
1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 7121 Solved: 2816[Submit][Stat ...
- BZOJ 1211 HNOI2004 树的计数 Prufer序列
题目大意:给定一棵树中全部点的度数,求有多少种可能的树 Prufer序列.详细參考[HNOI2008]明明的烦恼 直接乘会爆long long,所以先把每一个数分解质因数.把质因数的次数相加相减.然后 ...
- BZOJ 1005 明明的烦恼(prufer序列+高精度)
有一种东西叫树的prufer序列,一个树的与一个prufer序列是一一对应的关系. 设有m个度数确定的点,这些点的度为dee[i],那么每个点在prufer序列中出现了dee[i]-1次. 由排列组合 ...
- BZOJ 1005 明明的烦恼 Prufer序列+组合数学+高精度
题目大意:给定一棵n个节点的树的节点的度数.当中一些度数无限制,求能够生成多少种树 Prufer序列 把一棵树进行下面操作: 1.找到编号最小的叶节点.删除这个节点,然后与这个叶节点相连的点计入序列 ...
- BZOJ 1005 prufer序列
给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? 第一行为N(0 < N < = 1000),接下来N行,第i+1行给出第i个节点的度数Di ...
- bzoj 1005: [HNOI2008]明明的烦恼 prufer编号&&生成树计数
1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2248 Solved: 898[Submit][Statu ...
随机推荐
- WinForm中跨线程操作控件
在WinForm编程时会遇到通过后台线程操作界面的情况,直接在后台线程执行的方法中直接操作控件会报错,这时候就要使用跨线程方式间接操作控件.下面是两种实现方式. 1.采用定义delegate的方式 ...
- 【转】PowerShell入门(一):PowerShell能干什么?
转至:http://www.cnblogs.com/ceachy/archive/2013/01/30/WhatCanPowerShellDo.html PowerShell能干什么呢?就像序言中提到 ...
- 自定义view 画圆
package com.exaple.day01rikao; import android.content.Context; import android.graphics.Canvas; impor ...
- Bootstrapper.cs
using System.Windows; using Microsoft.Practices.Prism.Modularity; using Microsoft.Practices.Prism.Un ...
- [多校联考2 T3] 排列 (DP)
DP Description 对于一个排列,考虑相邻的两个元素,如果后面一个比前面一个大,表示这个位置是上升的,用 I 表示,反之这个位置是下降的,用 D表示.如排列 3,1,2,7,4,6,5 可以 ...
- [四校联考P3] 区间颜色众数 (主席树)
主席树 Description 给定一个长度为 N 颜色序列A,有M个询问:每次询问一个区间里是否有一种颜色的数量超过了区间的一半,并指出是哪种颜色. Input 输入文件第一行有两个整数:N和C 输 ...
- web服务器工作原理
Web服务器工作原理概述 转载自http://www.importnew.com/15020.html 很多时候我们都想知道,web容器或web服务器(比如Tomcat或者jboss)是怎样工作的?它 ...
- assigning to 'id<UIGestureRecognizerDelegate> _Nullable' from incompatible
tip:参考 http://stackoverflow.com/questions/9861538/assigning-to-iddelegate-from-incompatible-type-vie ...
- UVa 12299 RMQ with Shifts(移位RMQ)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: "Times New ...
- 一步一步学习underscore的封装和扩展方式
前言 underscore虽然有点过时,这些年要慢慢被Lodash给淘汰或合并. 但通过看它的源码,还是能学到一个库的封装和扩展方式. 第一步,不污染全局环境. ES5中的JS作用域是函数作用域. 函 ...