1005: [HNOI2008]明明的烦恼

Description

  自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在
任意两点间连线,可产生多少棵度数满足要求的树?

Input

  第一行为N(0 < N < = 1000),
接下来N行,第i+1行给出第i个节点的度数Di,如果对度数不要求,则输入-1

Output

  一个整数,表示不同的满足要求的树的个数,无解输出0

Sample Input

3
1
-1
-1

Sample Output

2

HINT

  两棵树分别为1-2-3;1-3-2

Source

题解:

n为树的节点数,d[ ]为各节点的度数,m为无限制度数的节点数。
则            
所以要求在n-2大小的数组中插入tot各序号,共有种插法;
在tot各序号排列中,插第一个节点的方法有种插法;
                           插第二个节点的方法有种插法;
                                      ………
另外还有m各节点无度数限制,所以它们可任意排列在剩余的n-2-tot的空间中,排列方法总数为
 
根据乘法原理:
 
 
然后就要高精度了…..但高精度除法太麻烦了,显而易见的排列组合一定是整数,所以可以进行质因数分解,再做一下相加减。
 
 
关于n!质因数分解有两种方法,第一种暴力分解,这里着重讲第二种。
  若p为质数,则n!可分解为 一个数*,其中  <n
 
所以 

——转自怡红公子

  

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include<vector>
using namespace std;
const int N = 1e5+, M = 1e3+, mod = , inf = 1e9+;
typedef long long ll;
int n;
int d[N],ans[N];
int cnt[N],len=;
void go_way(int x,int key) {
for(int j=;j*j<=x;j++) {
while(x%j==) {
cnt[j]+=key;
x/=j;
// cout<<j<<endl;
}
}
cnt[x]+=key;
}
int sum = ,m;
void mul(int x)
{
for(int i=;i<=len;i++)
ans[i]*=x;
for(int i=;i<=len;i++)
{
ans[i+]+=ans[i]/mod;
ans[i]%=mod;
}
while(ans[len+]>)
{len++;ans[len+]+=ans[len]/mod;ans[len]%=mod;}
}
int main() {
scanf("%d",&n);
if(n==) {
int x;
scanf("%d",&x);
if(!x) cout<<;
else cout<<;
return ;
}
for(int i=;i<=n;i++) {
scanf("%d",&d[i]);
if(!d[i]) {cout<<;return ;}
if(d[i]==-) m++;
else {d[i]--;sum+=(d[i]);}
}
if(sum > n-) {
cout<<;
return ;
}
for(int i=;i<=n-;i++) go_way(i,);
for(int i=;i<=n--sum;i++) {
go_way(i,-);
}
for(int i=;i<=n;i++) {
if(d[i])
for(int j=;j<=d[i];j++) {
go_way(j,-);
}
}
ans[] = ;
for(int i=;i<=n;i++) {
for(int j=;j<=cnt[i];j++) mul(i);
}
for(int i=;i<=n--sum;i++) mul(m);
for(int i=len;i>=;i--)
if(i==len)printf("%d",ans[i]);
else printf("%06d",ans[i]);
return ;
}

最新文章

  1. TODO:数据库优化之分页
  2. 给MySQL增加mysql-udf-http和mysql-udf-json自定义函数,让MySQL有调用http接口和查询直接回JSON的能力
  3. httpclient+Jsoup总结
  4. shell变量判空几种方法
  5. web.config中httpRunTime的属性
  6. C/C++中如何获取数组的长度?
  7. func 和action 委托的使用
  8. 一步一步学Vue(三)
  9. 201521123025 《Java程序设计》第2周学习总结
  10. 应用shell脚本停启Tomcat
  11. ansible-playbook(nginx例)
  12. vue 结合 FileReader() 实现上传图片预览功能
  13. onkeyup+onafterpaste 只能输入数字和小数点--转载
  14. jmeter4.0的汉化
  15. input debounce
  16. linux od命令详解
  17. [mysql] mysql 查询语句收集
  18. 通过超链接启动App
  19. 软件测试----H模型
  20. [励志英语片段]practicing deliberately

热门文章

  1. Spark2.0.2+Zeppelin0.6.2 环境搭建 初探
  2. 消除svn选定(checkout)桌面上文件显示一大堆问号。
  3. SQLServer2008 表连接时null 和 null 无法匹配?
  4. create-react-app 中设置反向代理、项目打包资源引入路径设置及 map 文件
  5. 《Java编程思想》学习笔记(一)
  6. numpy安装失败-小失误
  7. 【汇编】MASM6.15几个简单的汇编程序
  8. ASP.NET MVC5 网站开发实践(一)
  9. 点击button 触发另一个button 事件
  10. :before和:after结合使用