BZOJ 1005: [HNOI2008]明明的烦恼(高精度+prufer序)
解题思路
看到度数和生成树个树,可以想到$prufer$序,而一张规定度数的图的生成树个数为$\frac{(n-2)!}{\prod\limits_n(d(i)-1)!}$。而这道题有的度数没有限制,那就设有度数限制的点的个数为$num$,$\sum (d_i-1)$为$sum$。把这些点先填入$prufer$序中,其余没有限制的点可以随便填,再乘上组合数,答案应该为$C(n-2,sum)\frac{(sum!}{\prod (d_i-1)!}(n-cnt)\(,把组合数展开得\)\frac{(n-2)!}{(n-2-sum)!*\prod(d_i-1)!} *(n-cnt)^$。避免写高精除,可以把他们质因数分解,然后高精乘。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int N=6005;
int n,prime[N],cnt,d[N],tot[N],sum;
bool vis[N];
struct bign{
int a[N],len;
bign mul(bign A,int B){
for(int i=1;i<=A.len;i++) A.a[i]*=B;
for(int i=1;i<=A.len;i++)
A.a[i+1]+=A.a[i]/10,A.a[i]%=10;
while(A.a[A.len+1]) {
A.len++; A.a[A.len+1]+=A.a[A.len]/10;
A.a[A.len]%=10;
}
return A;
}
}ANS;
inline void prework(){
for(int i=2;i<=1000;i++){
if(!vis[i]) prime[++cnt]=i;
for(int j=1;j<=cnt && i*prime[j]<=1000;j++)
vis[i*prime[j]]=1;
}
}
inline void work(int x,int k){
for(int i=1;i<=cnt;i++){
if(prime[i]>x) return ;
while(!(x%prime[i])) tot[i]+=k,x/=prime[i];
}
}
int main(){
scanf("%d",&n); prework(); int num=0;
for(int i=2;i<=n-2;i++) work(i,1);
for(int i=1;i<=n;i++) {
scanf("%d",&d[i]);
if(d[i]==-1) continue;
sum+=d[i]-1; num++;
for(int j=2;j<d[i];j++) work(j,-1);
}
for(int i=2;i<=n-2-sum;i++) work(i,-1);
work(n-num,n-2-sum); ANS.len=1; ANS.a[1]=1;
for(int i=1;i<=cnt;i++)
while(tot[i]--) ANS=ANS.mul(ANS,prime[i]);
for(int i=ANS.len;i;i--) printf("%d",ANS.a[i]);
return 0;
}
BZOJ 1005: [HNOI2008]明明的烦恼(高精度+prufer序)的更多相关文章
- BZOJ 1005: [HNOI2008]明明的烦恼(prufer数列)
http://www.lydsy.com/JudgeOnline/problem.php?id=1005 题意: Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标 ...
- BZOJ 1005 [HNOI2008] 明明的烦恼(组合数学 Purfer Sequence)
题目大意 自从明明学了树的结构,就对奇怪的树产生了兴趣...... 给出标号为 1 到 N 的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为 N( ...
- BZOJ 1005 [HNOI2008]明明的烦恼 (Prufer编码 + 组合数学 + 高精度)
1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5786 Solved: 2263[Submit][Stat ...
- 【BZOJ 1005】 1005: [HNOI2008]明明的烦恼 (prufer数列+高精度)
1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4981 Solved: 1941 Description ...
- bzoj 1005: [HNOI2008]明明的烦恼 prufer编号&&生成树计数
1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2248 Solved: 898[Submit][Statu ...
- BZOJ 1005: [HNOI2008]明明的烦恼( 组合数学 + 高精度 )
首先要知道一种prufer数列的东西...一个prufer数列和一颗树对应..然后树上一个点的度数-1是这个点在prufer数列中出现次数..这样就转成一个排列组合的问题了.算个可重集的排列数和组合数 ...
- BZOJ 1005 [HNOI2008]明明的烦恼 purfer序列,排列组合
1005: [HNOI2008]明明的烦恼 Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少 ...
- BZOJ 1005: [HNOI2008]明明的烦恼 Purfer序列 大数
1005: [HNOI2008]明明的烦恼 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/ ...
- bzoj 1005 [HNOI2008] 明明的烦恼 (prufer编码)
[HNOI2008]明明的烦恼 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5907 Solved: 2305[Submit][Status][Di ...
随机推荐
- LOJ 6436 「PKUSC2018」神仙的游戏——思路+卷积
题目:https://loj.ac/problem/6436 看题解才会. 有长为 i 的 border ,就是有长为 n-i 的循环节. 考虑如果 x 位置上是 0 . y 位置上是 1 ,那么长度 ...
- NOIp 数据结构专题总结 (2):分块、树状数组、线段树
系列索引: NOIp 数据结构专题总结 (1) NOIp 数据结构专题总结 (2) 分块 阅:<「分块」数列分块入门 1-9 by hzwer> 树状数组 Binary Indexed T ...
- 点击按钮后URL呗改变
这里留个坑,Button默认类型是submit.没有写类型的,可能会导致触发Url改变.要么写类型,要么在按钮对应的Js方法里return.
- qbxt Day3 on 2019-8-18
qbxt Day3 on 2019-8-18 一.基础数论 1.进制转换 进制转换是一个非常简单且基础的问题. 也许我们只需要...Emmm... 列个式子就好了鸭 设\(k\)进制数每一位上是\(a ...
- CentOS 7下升级python版本到3.X
由于python官方已宣布2.x系列即将停止支持,为了向前看,我们升级系统的python版本为3.x系列服务器系统为当前最新的CentOS 7.4 1.安装前查看当前系统下的python版本号 # p ...
- 关于列表倒序输出的几种方法——python第7天
项目:将列表li1 = [1, 6, 4, 3, 7, 9]倒序输出为[9, 7, 6, 4, 3, 1] li2 = ['a', 'm', 's', 'g']倒序输出为['g', 's', 'm', ...
- 什么是中间件?中间件和java应用关系是什么
中间件,比如websphere 是一种独立的系统软件,你的java应用要通过它来管理,比如数据库连接,消息通信等,中间件位于操作系统之上.简单滴说,你不可能直接把你的java应用部署在操作系统上,得由 ...
- css设置图片的高等于图片的高
<div class="box"> <img src="img/2222.jpg" /> </div> .box { pos ...
- 【笔记目录1】【jessetalk 】ASP.NET Core快速入门_学习笔记汇总
当前标签: ASP.NET Core快速入门 共2页: 1 2 下一页 任务50:Identity MVC:DbContextSeed初始化 GASA 2019-03-02 14:09 阅读:16 ...
- Java开发中的23种设计模式详解(1)创建型
设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...