【BZOJ1005】【HNOI2008】明明的烦恼
又是看黄学长的代码写的,估计我的整个BZOJ平推计划都要看黄学长的代码写
原题:
自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在
任意两点间连线,可产生多少棵度数满足要求的树?
0 < N < = 1000
这题用到了树的prufer编码
prufer编码是什么呐
注意下面扯到的树都是无根树(下面不少定义是从黄学长哪里直接粘过来的)
每次删除树中度数为1且序号最小的节点,并在序列中添加与其相邻的节点的序号,直到树中有两个节点,手玩一组小数据很容易理解(逃
呢么任意一棵树都有唯一的长度为n-2的prufer编码,且度数为m的节点在编码中出现了m-1次
呢么就可以将编码还原回一棵树,从prufer编码的最前端开始扫描节点,设该节点序号为 u ,寻找不在prufer编码的最小序号且没有被标记的节点 v ,连接 u,v,并标记v,将u从prufer编码中删除。扫描下一节点。
题中已经把度数给了,呢么就用prufer编码解决
不会写数学表达式,直接粘黄学长的解释吧(sro_hzwer_orz)
题目很丧心病狂的没有让膜一个数,所以要高精度
然而如果用高精度除就亏了,因为这个式子求的是方法数,最后肯定是个整数,呢么就可以分解质因数然后加减,最后再高精度乘
高精度乘可以使用万进制优化,这里有个小技巧,scanf("%abd");表示输出b位数,不够的部分前面补a
因为高精度乘WA了5次,实力会随着时间的推移而减弱qaq
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int mo=;
int n,a[];
int m=,tot=;
int zhi[],ztop=;
bool kang[];
int num[];
int ans[],la=;
void shai(){
memset(kang,,sizeof(kang));
for(int i=;i<=;i++)if(!kang[i]){
zhi[++ztop]=i;
int temp=;
while(i*temp<=){
kang[i*temp]=true;
temp++;
}
}
}
void buff(int x,int y){//hzwer_orz,用一个参数可以将加和减的代码合并
for(int i=;i<=x;i++){//阶乘
int c=i;
for(int j=;c>=zhi[j];j++)
while(!(c%zhi[j])){
num[j]+=y;
c/=zhi[j];
}
}
}
void mul(int x){
for(int i=;i<=la;i++) ans[i]*=x;
for(int i=;i<=la;i++){
ans[i+]+=ans[i]/mo;
ans[i]%=mo;
}
while(ans[la+]){ la++; ans[la+]+=ans[la]/mo; ans[la]%=mo;}
}
int main(){
//freopen("ddd.in","r",stdin);
//freopen("bzoj_1005.in","r",stdin);
//freopen("bzoj_1005.out","w",stdout);
memset(num,,sizeof(num));
shai();
cin>>n;
if(n==){
scanf("%d",&a[]);//注意因为a要--,所以这个特判不能放下面
if(!a[] || a[]==-) cout<<<<endl;
else cout<<<<endl;
return ;
}
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
if(!a[i]){ cout<<<<endl; return ;}
if(a[i]==-) m++;
else a[i]--,tot+=a[i];
}
buff(n-,);
buff(n--tot,-);
for(int i=;i<=n;i++)if(a[i]) buff(a[i],-);
ans[la=]=;
for(int i=;i<=ztop;i++)
while(num[i] --> )//趋向于
//mul(num[i]);静态差错多重要?这是第二个傻逼错误了
mul(zhi[i]);
for(int i=;i<=n--tot;i++)
mul(m);
//for(int i=1;i<=la;i++) cout<<ans[i]<<" "; cout<<endl;
cout<<ans[la];//之前写成最后输出ans[1] qaq
for(int i=la-;i>=;i--) printf("%05d",ans[i]);//之前写成2到la了,实力会随着时间的推移而降低qaq,然后还是之前写成%04 qaq
cout<<endl;
//因为高精度乘WA了5次QAQ
return ;
}
【BZOJ1005】【HNOI2008】明明的烦恼的更多相关文章
- bzoj1005 [HNOI2008]明明的烦恼
1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3032 Solved: 1209 Description ...
- bzoj1005: [HNOI2008]明明的烦恼(prufer+高精度)
1005: [HNOI2008]明明的烦恼 题目:传送门 题解: 毒瘤题啊天~ 其实思考的过程还是比较简单的... 首先当然还是要了解好prufer序列的基本性质啦 那么和1211大体一致,主要还是利 ...
- [BZOJ1005] [HNOI2008] 明明的烦恼 (prufer编码)
Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为N ...
- 【prufer编码+组合数学】BZOJ1005 [HNOI2008]明明的烦恼
Description 自从明明学了树的结构,就对奇怪的树产生了兴趣...... 给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Solution 这 ...
- BZOJ1005 HNOI2008明明的烦恼(prufer+高精度)
每个点的度数=prufer序列中的出现次数+1,所以即每次选一些位置放上某个点,答案即一堆组合数相乘.记一下每个因子的贡献分解一下质因数高精度乘起来即可. #include<iostream&g ...
- BZOJ1005:[HNOI2008]明明的烦恼(组合数学,Prufer)
Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为N ...
- [bzoj1005][HNOI2008][明明的烦恼] (高精度+prufer定理)
Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为N ...
- bzoj1005: [HNOI2008]明明的烦恼 prufer序列
https://www.lydsy.com/JudgeOnline/problem.php?id=1005 给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的 ...
- [bzoj1005][HNOI2008]明明的烦恼-Prufer编码+高精度
Brief Description 给出标号为1到N的点,以及某些点最终的度数,允许在 任意两点间连线,可产生多少棵度数满足要求的树? Algorithm Design 结论题. 首先可以参考这篇文章 ...
- [BZOJ1005][HNOI2008]明明的烦恼 数学+prufer序列+高精度
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int N; ...
随机推荐
- C++质因式分解
分解质因数是将一个数差分成为几个质数相乘,本函数n初始取2 void prim(int m, int n) { if (m > n) { while (m%n) n++; m/=n; prim( ...
- java基础之hashmap
Hashmap是一种非常常用的.应用广泛的数据类型,最近研究到相关的内容,就正好复习一下.网上关于hashmap的文章很多,但到底是自己学习的总结,就发出来跟大家一起分享,一起讨论. 1.hashma ...
- Apache虚拟目录(二)
一.PHP生命周期 二.轻量级的PHP 轻量级PHP产品由lighttpd,nginx等等 Apache是基于模块化设计的 了解Apache源代码可以从main.c开始 操作系统上跑了APR运行库 m ...
- MySQL数据类型(四)
一.数据类型 二.整型类型 tinyInt: 1个字节:-128-127(有符号) 是否有符号,可以定义时,使用unsign标识,表示无符号的,不写表示有符号的 Create table studen ...
- HTML基础学习笔记
一.基本结构 <html>——开始标记 <head></head>——头标记,用来控制布局.编码.特效等内容 <body></body>—— ...
- Ogre中Mesh的加载过程详述
转自:http://blog.csdn.net/yanonsoftware/article/details/1031891 如果新开始写一个3D渲染引擎,Mesh应该是一个很好的切入点.当一个看似简单 ...
- 在windows 、linux下读取目录下所有文件名
Windows要引入的头文件是<Windows.h> 主要是两个函数FindFirstFile.FindNextFile MSDN里是这么说的: FindFirstFile functio ...
- weblogic服务器的简单使用(一)
一.前言 现在的公司开发的项目基于的平台是weblogic8.1.5,虽然版本是旧了点,但是用到的功能还是很多的,如JNDI.t3协议.EJB2.0.线程池.连接池.Ant部署.java远程调试. 发 ...
- RFIDler:一款定义RFID的读、写、仿真器的开源软件
很多类似于RFID这样的技术看起来都很神秘,实际上他是依赖于很多物理学原理的,比如”电磁感应原理”.是的,这些现象产生的各种信号足以令人发狂,看完这些模拟模拟信号后,我忽然发现二进制信息多么干净美丽. ...
- 【Tsinghua OJ】祖玛(Zuma)问题
描述 祖玛是一款曾经风靡全球的游戏,其玩法是:在一条轨道上初始排列着若干个彩色珠子,其中任意三个相邻的珠子不会完全同色.此后,你可以发射珠子到轨 道上并加入原有序列中.一旦有三个或更多同色的珠子变成相 ...