bzoj1211: prufer序列 | [HNOI2004]树的计数
2015-10-20 17:41
447 查看
题目大意:
告诉你树上每个节点的度数,让你构建出这样一棵树,问能够构建出树的种树
这里注意数量为0的情况,就是
当 n=1时,节点度数>0
n>1时,所有节点度数相加-n!=n-2 可以通过通过除了根,必然有n-1个节点作为上一个节点的儿子来理解
然后通过学习prufer序列可知
每一颗树都能够建成唯一的序列,这里的n-2个数就是任意插入到prufer序列中,这很明显就是一个排列,那么之后就是计算
ans = (n-2)!/(w[1]!*w[2]!..w
!) w[i]表示i节点上的度数减1,或者理解为以最大的点n作为根,i有多少个儿子节点。
这里不取模,防止值溢出,要分解质因数
告诉你树上每个节点的度数,让你构建出这样一棵树,问能够构建出树的种树
这里注意数量为0的情况,就是
当 n=1时,节点度数>0
n>1时,所有节点度数相加-n!=n-2 可以通过通过除了根,必然有n-1个节点作为上一个节点的儿子来理解
然后通过学习prufer序列可知
每一颗树都能够建成唯一的序列,这里的n-2个数就是任意插入到prufer序列中,这很明显就是一个排列,那么之后就是计算
ans = (n-2)!/(w[1]!*w[2]!..w
!) 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[200] , num[200]; vector<pii> v[200]; void solve(int m) { if(m==1) return; int tmp = m; for(int i=2 ; i<=m ; i++){ if(m%i==0){ int cnt = 0; while(m%i==0){ m/=i; cnt++; } v[tmp].push_back(make_pair(i , cnt)); } } if(m>1) v[tmp].push_back(make_pair(m , 1)); // for(int i=0 ; i<v[tmp].size() ; i++) cout<<v[tmp][i].first<<" "<<v[tmp][i].second<<endl; } void init() { for(int i=1 ; i<=150 ; i++) solve(i); } void update(int k , int flag) { for(int i=0 ; 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=1 ; i<=tim ; i++) ans=ans*k; } int main() { // freopen("Sweet.in" , "r" , stdin); init(); while(~scanf("%d" , &n)){ memset(num , 0 , sizeof(num)); int sum=0 , flag=true; for(int i=1 ; i<=n ; i++){ scanf("%d" , &w[i]); if(n!=1 && w[i]<1) flag=false; if(n==1 && w[i]!=0) flag=false; w[i]--; sum+=w[i]; for(int j=1 ; j<=w[i] ; j++) update(j , -1); } if((n>1&&sum!=n-2) || flag==false){ cout<<0<<endl; continue; } for(int i=1 ; i<=n-2 ; i++) update(i , 1); long long ans = 1; for(int i=1 ; i<=n-2 ; i++){ if(num[i]) mul(ans , i , num[i]); } cout<<ans<<endl; } return 0; }
相关文章推荐
- 使用pdf.js显示pdf文件
- 27/Feb/2008:10:12:44 +0800这样的日期格式在java里的解析.
- 【bzoj1821】 JSOI2010Group 部落划分 二分+并查集
- ie8下使用jquery-file-upload上传文件后返回json格式数据提示下载
- 深入解析JavaScript的闭包机制
- css 元素跳动代码
- 【学习笔记javascript设计模式与开发实践(单例模式)----4】
- hibernate 普通字段延迟加载无效的解决办法(如:Lazy Fetch Blob)
- bootstrap-datetimepicker在ie8下报对象不支持"indexOf"属性或方法
- jquery带按钮的图片切换效果
- CSS 框模型Margin ,Border ,Padding ,Content
- jQuery的deferred对象详解
- jQuery小例子
- Javascript中的数据类型之旅
- JavaScript 核心参考教程 内置对象
- nodejs如果npm install express -g远程安装费时
- 了解 JavaScript 中的内置对象
- 操作jQuery集合——搜索操作
- javascript面向对象方式,调用属性和方法
- w3school js 测验