Luogu P2624 [HNOI2008]明明的烦恼 Prufer+组合+高精
好的我把标准版过了。。。
设$ r_i$为$i$的度数
首先,我们设 $ sum = \Sigma r_i-1$,$ tot $ 为所有能够确定度数的点
所以我们有
$ C ^ {sum} _{n-2} * \frac{sum!}{\Pi(r_i-1)!} *(n-tot)^{n-2-sum} $
$C ^ {sum} _{n-2}$ 表示从n-2个位置中选出sum个(因为他们肯定出现在$ Prufer$序列里)
$ \frac{sum!}{\Pi(r_i-1)!}$是多重集的排列
$(n-tot)^{n-2-sum} $ 是指拿剩下的n-tot个点,填在$Prufer$ 剩下的位置中
原式经化简为
$ \frac{(n-2)!}{(n-2-sum)!*\Pi(r_i-1)!}*(n-tot)^{n-2-sum}$
所以把他们分解质因数扔进去就好了
然后要用高精(第一次压位qwq)
#include<cstdio>
#include<iostream>
#include<cstring>
#define R register int
using namespace std;
const int B=,N=;
inline int g() {
R ret=,fix=; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret*fix;
}
struct Int {
int sz,dat[];
Int() {sz=; memset(dat,,sizeof(dat));}
inline void init(int vl) {
sz=; while(vl) ++sz,dat[sz]=vl%B,vl/=B;
} inline void print() {
printf("%d",dat[sz]);
for(R i=sz-;i;--i) printf("%04d",dat[i]);
}
};
Int operator *(Int a,int b) {
Int c; R lst=a.sz;
for(R i=;i<=lst;++i) c.dat[i]=a.dat[i]*b;
for(R i=;i<=lst;++i) c.dat[i+]+=c.dat[i]/B,c.dat[i]%=B;
while(c.dat[lst+]) ++lst,c.dat[lst+]+=c.dat[lst]/B,c.dat[lst]%=B;
c.sz=lst; return c;
}
Int ans;
int n,sum,tot;
int r[N],cnt[N];
inline void add(int x,int vl) {
for(R i=;i*i<=x;++i)
while(x%i==) x/=i,cnt[i]+=vl;
if(x>) cnt[x]+=vl;
}
signed main() { //freopen("1.in","r",stdin); freopen("out.out","w",stdout);
n=g(); for(R i=;i<=n;++i) {
r[i]=g(); if(r[i]==-) continue; ++tot,sum+=r[i]-;
} if(sum>n-) {printf("0\n"); return ;}
for(R i=n-;i;--i) add(i,);
for(R i=n--sum;i;--i) add(i,-);
for(R i=;i<=n;++i) {
if(r[i]==-) continue; for(R j=;j<r[i];++j) add(j,-);
} for(R i=;i<=n--sum;++i) add(n-tot,); ans.init();
for(R i=;i<=n;++i) for(R j=;j<=cnt[i];++j) ans=ans*i;
ans.print(); putchar('\n');
}
2019.05.16
Luogu P2624 [HNOI2008]明明的烦恼 Prufer+组合+高精的更多相关文章
- BZOJ 1005 [HNOI2008]明明的烦恼 (Prufer编码 + 组合数学 + 高精度)
1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5786 Solved: 2263[Submit][Stat ...
- bzoj 1005: [HNOI2008]明明的烦恼 prufer编号&&生成树计数
1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2248 Solved: 898[Submit][Statu ...
- bzoj 1005 [HNOI2008] 明明的烦恼 (prufer编码)
[HNOI2008]明明的烦恼 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5907 Solved: 2305[Submit][Status][Di ...
- BZOJ.1005.[HNOI2008]明明的烦恼(Prufer 高精 排列组合)
题目链接 若点数确定那么ans = (n-2)!/[(d1-1)!(d2-1)!...(dn-1)!] 现在把那些不确定的点一起考虑(假设有m个),它们在Prufer序列中总出现数就是left=n-2 ...
- [luogu2624 HNOI2008]明明的烦恼 (prufer+高精)
传送门 Solution 根据prufer序列做的题,具体可以看这里 还知道了一种避免高精除的方法quq Code #include <cmath> #include <cstdio ...
- [BZOJ1005] [HNOI2008] 明明的烦恼 (prufer编码)
Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为N ...
- 【bzoj1005】[HNOI2008]明明的烦恼 Prufer序列+高精度
题目描述 给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? 输入 第一行为N(0 < N < = 1000),接下来N行,第i+1行给出第i ...
- bzoj1005: [HNOI2008]明明的烦恼 prufer序列
https://www.lydsy.com/JudgeOnline/problem.php?id=1005 给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的 ...
- BZOJ 1005 [HNOI2008]明明的烦恼 ★(Prufer数列)
题意 N个点,有些点有度数限制,问这些点可以构成几棵不同的树. 思路 [Prufer数列] Prufer数列是无根树的一种数列.在组合数学中,Prufer数列是由一个对于顶点标过号的树转化来的数列,点 ...
随机推荐
- HDU5446 Unknown Treasure(组合数膜合数-->Lucas+中国剩余定理)
>On the way to the next secret treasure hiding place, the mathematician discovered a cave unknown ...
- myod中遇到的问题
一.准备工作 首先在编程之前遇到的第一个问题就是要了解需要编出一个怎样的代码,了解od -tx -tc的具体意思,并观察其输出结果. -tc代表着输出ASCII字符,而-tx则是代表着输出ASCII字 ...
- DTP模型之一:(XA协议之一)XA协议、二阶段2PC、三阶段3PC提交
XA协议 XA是一个分布式事务协议,由Tuxedo提出.XA中大致分为两部分:事务管理器和本地资源管理器.其中本地资源管理器往往由数据库实现,比如Oracle.DB2这些商业数据库都实现了XA接口,而 ...
- word2010以上版本中快捷录入数学公式的方法(二)
以前推荐的方法,随着方正飞翔网站上关闭了数学公式输入法的支持也不能不用了,现在再推荐一个可以在word2010以上版中快捷输入数学公式的方法,安装AxMath,一切问题都OK!我是直接购买的正版,25 ...
- oracle--存储过程2--bk
oracle存储过程demo1---无返回值的存储过程: /* 写一个过程,可以向book表添加书 */ create table book( id number(4), book_name varc ...
- 【jQuery】slice()方法的使用
[jQuery]slice()方法的使用 slice()方法:从已有的数组中返回选定的元素. 语法: arrayObj.slice(start, end) ...
- 什么是Nginx?为什么使用Nginx?
源自 https://blog.csdn.net/yougoule/article/details/78186138 一.前言 为毛要用nginx服务器代理,不直接用tomcat 7.0,还 ...
- js中一些小知识点总结--持续更新
以下知识点来自于编写高质量代码-改善JavaScript程序的188个建议,只用于自我知识的补充. 一.NaN 1.NaN是一个特殊的数量值,不表示一个数字,尽管下面的代码仍然是返回类型为number ...
- Linux下统计代码行数
使用wc统计代码行数 最近写了一些代码,想统计一下代码的行数,在eclipse中好像没这功能,网上搜了一下才发现原来Linux有一个统计文件行数的命令wc.使用wc可以打印出每个文件和总文件的行数.字 ...
- [poj3281]Dining(最大流+拆点)
题目大意:有$n$头牛,$f$种食物和$d$种饮料,每种食物或饮料只能供一头牛享用,且每头牛只享用一种食物和一种饮料.每头牛都有自己喜欢的食物种类列表和饮料种类列表,问最多能使几头牛同时享用到自己喜欢 ...