BZOJ.1005.[HNOI2008]明明的烦恼(Prufer 高精 排列组合)
若点数确定那么ans = (n-2)!/[(d1-1)!(d2-1)!...(dn-1)!]
现在把那些不确定的点一起考虑(假设有m个),它们在Prufer序列中总出现数就是left=n-2-(d1-1)-(d2-1)-...-(dn-1)
这left个数本身又有m^{left}种
所以 ans = (n-2)!/[(d1-1)!(d2-1)!...(dn-1)!left!]*m^{left}
显然需要高精度。为避免高精除需要对每个阶乘分解质因数(这个组合数算出来一定是整数,所以分解质因数和分子减掉分母的次数即可)
n!中含质因子p个数公式: f(n)=f(n/p)+n/p
注意下无解的两种情况
要乘的数很小 就容易了
//1228kb 28ms
#include <cstdio>
const int N=1005,Base=10000;
int n,dgr[N],up[N],down[N],cnt,P[N],ans[100005];
bool Not_P[N+3];
void Init()
{
Not_P[1]=1;
for(int i=2; i<N; ++i)
{
if(!Not_P[i]) P[++cnt]=i;
for(int j=1; j<=cnt&&i*P[j]<N; ++j)
{
Not_P[i*P[j]]=1;
if(!(i%P[j])) break;
}
}
}
void Divide(int x,int *a)
{
for(int i=1; i<=cnt&&P[i]<=x; ++i)
for(int tmp=x; tmp; tmp/=P[i]) a[i]+=tmp/P[i];
}
void Mult(int *a,int b)
{
for(int i=1; i<=a[0]; ++i) a[i]*=b;
// if(a[i]/Base) a[i+1]+=a[i]/Base, a[i]%=Base;//需要都乘完后再进位
for(int i=1; i<=a[0]; ++i)
if(a[i]/Base) a[i+1]+=a[i]/Base, a[i]%=Base;
// else break;//WA:显然不可以嘛
if(a[a[0]+1]) ++a[0];
}
void Print(int *a)
{
printf("%d",a[a[0]]);
for(int i=a[0]-1; i; --i) printf("%0*d",4,a[i]);
// putchar('\n');
}
int main()
{
scanf("%d",&n), Init();
int tot=0,m=0;
for(int i=1; i<=n; ++i)
{
scanf("%d",&dgr[i]);
if(dgr[i]>1) tot+=dgr[i]-1, Divide(dgr[i]-1,down);
else if(dgr[i]<0) ++m;
else if(!dgr[i]) tot=N;
}
if(tot>n-2 || (tot==n-2&&!m)) {putchar('0'); return 0;}
int left=n-2-tot;
Divide(n-2,up), Divide(left,down);
for(int i=1; i<=cnt; ++i) up[i]-=down[i];
// for(int i=1; i<=cnt; ++i) printf("%d^%d\n",P[i],up[i]);
ans[ans[0]=1]=1;
for(int i=1; i<=cnt; ++i)
while(up[i]--) Mult(ans,P[i]);
for(int i=1; i<=left; ++i) Mult(ans,m);
Print(ans);
return 0;
}
BZOJ.1005.[HNOI2008]明明的烦恼(Prufer 高精 排列组合)的更多相关文章
- BZOJ 1005 [HNOI2008]明明的烦恼 purfer序列,排列组合
1005: [HNOI2008]明明的烦恼 Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少 ...
- bzoj 1005: [HNOI2008]明明的烦恼 prufer编号&&生成树计数
1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2248 Solved: 898[Submit][Statu ...
- BZOJ 1005 [HNOI2008]明明的烦恼 (Prufer编码 + 组合数学 + 高精度)
1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5786 Solved: 2263[Submit][Stat ...
- bzoj 1005 [HNOI2008] 明明的烦恼 (prufer编码)
[HNOI2008]明明的烦恼 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5907 Solved: 2305[Submit][Status][Di ...
- [luogu2624 HNOI2008]明明的烦恼 (prufer+高精)
传送门 Solution 根据prufer序列做的题,具体可以看这里 还知道了一种避免高精除的方法quq Code #include <cmath> #include <cstdio ...
- BZOJ 1005 [HNOI2008]明明的烦恼 ★(Prufer数列)
题意 N个点,有些点有度数限制,问这些点可以构成几棵不同的树. 思路 [Prufer数列] Prufer数列是无根树的一种数列.在组合数学中,Prufer数列是由一个对于顶点标过号的树转化来的数列,点 ...
- BZOJ 1005 [HNOI2008] 明明的烦恼(组合数学 Purfer Sequence)
题目大意 自从明明学了树的结构,就对奇怪的树产生了兴趣...... 给出标号为 1 到 N 的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为 N( ...
- BZOJ 1005: [HNOI2008]明明的烦恼( 组合数学 + 高精度 )
首先要知道一种prufer数列的东西...一个prufer数列和一颗树对应..然后树上一个点的度数-1是这个点在prufer数列中出现次数..这样就转成一个排列组合的问题了.算个可重集的排列数和组合数 ...
- BZOJ 1005: [HNOI2008]明明的烦恼 Purfer序列 大数
1005: [HNOI2008]明明的烦恼 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/ ...
随机推荐
- MAC上mongodb连接不上
1.在Mac客户端里输入 mongo,发现mongo连接不上了,原因是mongo的服务没有开启. 2.在命令行了输入 mongod,开启服务的命令 3.启动起来以后,用mongo连接服务器.
- 【逆向工具】逆向工具101editor使用-游戏快速通关
[渡者游戏简介] 船夫小江将运送客人的,羊.狐狸.草等物品过河,如果留下动物被其它种类吃掉任务就失败了.你需要帮助他做出正确的顺序选择.Ferryman是一款根据经典谜题改编的解谜游戏. 一.查看文件 ...
- 【转】Shell编程基础篇-下
[转]Shell编程基础篇-下 1.1 条件表达式 1.1.1 文件判断 常用文件测试操作符 常用文件测试操作符 说明 -d文件,d的全拼为directory 文件存在且为目录则为真,即测试表达式成立 ...
- 常用css样式(布局)
兼容css3新属性 在css3中,我们可以使用prefixfree.min.js这个插件来自动为css3的相关属性加上兼容浏览器属性,使我们不用为每个css3新属性再加上属性(需要用到大量css3的项 ...
- Ubungu 18.04安装MySQL 5.7.24
Ubuntu 18.04,mysql Ver 14.14 Distrib 5.7.24, for Linux (x86_64), USERNAME@USERNAME-VirtualBox:~$ sud ...
- PYTHON-基本数据类型-元祖类型,字典类型,集合类型-练习
# 1 有如下值集合 [11,22,33,44,55,66,77,88,99,90...],# 将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中## 即: ...
- ie6 表格td中无内容时不显示边框的解决办法
1.在单元格中加入一个空格.这样: <td> </td> 2.直接在table里这样写:<table border="0" cellspacing=& ...
- java 运算符 与(&)、非(~)、或(|)、异或(^)逻辑操作符 与(&&) 或(||) 非(!)
按位与&: 只要对应的二个二进位都为1时,结果位就为1 按位或|:只要对应的二个二进位有一个为1时,结果位就为1 按位异或^:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1) ...
- unittest中更高效的执行测试用例一个类只需要打开一次浏览器
示例代码 baidu.py # _*_ coding:utf-8 _*_ import csv,unittest #导入csv模块 from time import sleep from seleni ...
- 步步为营-33-Md5(32)加密与Base64加密
说明: 1:直接贴码 using System; using System.Collections.Generic; using System.ComponentModel; using System ...