博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 1211 [HNOI2004]树的计数
阅读量:6587 次
发布时间:2019-06-24

本文共 1729 字,大约阅读时间需要 5 分钟。

题目链接

思路

树转化成prufer序列,每个点在prufer序列的个数就是度数-1,因此答案就是

n!ni=1(di1)!n!∏i=1n(di−1)!

注意这道题需要分解质因数,这样就不需要写高精度了。

代码

#include 
#include
#include
const int maxn=150;int read(){ int x=0,f=1; char ch=getchar(); while((ch<'0')||(ch>'9')) { if(ch=='-') { f=-f; } ch=getchar(); } while((ch>='0')&&(ch<='9')) { x=x*10+ch-'0'; ch=getchar(); } return x*f;}int n,d[maxn+10],p[maxn+10][maxn+10],ans[maxn+10],tot;int main(){ n=read(); if(n==1) { int x=read(); if(x==0) { puts("1"); } else { puts("0"); } return 0; } for(int i=1; i<=n; ++i) { d[i]=read(); if(!d[i]) { puts("0"); return 0; } tot+=d[i]; } if(tot!=2*n-2) { puts("0"); return 0; } for(int i=2; i<=n; ++i) { int v=i; for(int j=2; j<=sqrt(i); ++j) { while(v%j==0) { v/=j; ++p[i][j]; } if(v==1) { break; } } if(v!=1) { ++p[i][v]; } } for(int i=2; i<=n; ++i) { for(int j=2; j<=i; ++j) { p[i][j]+=p[i-1][j]; } } for(int j=2; j<=n-2; ++j) { ans[j]=p[n-2][j]; } for(int i=1; i<=n; ++i) { for(int j=2; j<=d[i]-1; ++j) { ans[j]-=p[d[i]-1][j]; } } long long r=1; for(int i=2; i<=n; ++i) { if(ans[i]) { for(int j=1; j<=ans[i]; ++j) { r*=i; } } } printf("%lld\n",r); return 0;}

转载于:https://www.cnblogs.com/Canopus-wym/p/10376170.html

你可能感兴趣的文章
python实现进度条
查看>>
Android 一个应用启动另一个应用的说明
查看>>
Setting up the Web Admin Tool in LDAP 6.x to communicate via SSL
查看>>
SQL好习惯:编写支持可搜索的SQL
查看>>
Shadowbox
查看>>
【 程 序 员 】:伤不起的三十岁,你还有多远 ?
查看>>
openldap安装
查看>>
[leetcode]count and say
查看>>
润乾报表 - 缓存问题
查看>>
利用IFormattable接口自动参数化Sql语句
查看>>
泛型Dictionary的用法详解
查看>>
明晰三种常见存储技术:DAS、SAN和NAS
查看>>
ContentProvider简单介绍
查看>>
Visual Studio 2014 CTPs 下载 和C# 6.0 语言预览版介绍
查看>>
js混淆 反混淆 在线
查看>>
WinForm 之 程序启动不显示主窗体
查看>>
FragmentTransaction.replace() 你不知道的坑
查看>>
模拟退火算法
查看>>
StringUtils方法全集介绍
查看>>
性能调校
查看>>