bzoj 1005: [HNOI2008]明明的烦恼 树的prufer序列+万进制
思路:
这道题需要前置知识prufer编码,这篇博客对prufer编码和这道题的分析写的很好。
这里主要讲一些对大数阶乘的分解,一个办法当然是用高精度,上面这篇博客用的是java,还有一个办法是用万进制,但是普通的万进制只能计算乘法,而这里需要用到除法,又不能用逆元(因为没有取模)怎么办呢?
我们发现,上面那篇博客得到的式子是一个组合数的式子,所以必然是整数,如果把分子和分母共同进行质因子分解,那么上面的质因子的数量必然大于下面的,所以我们就把每一个阶乘和数字进行质因子分解,然后对分解出来的质因子用万进制处理(我实际上用的是百万进制)。
代码debug的时候有个很小的地方错了,看了一遍hzwer聚聚的代码,,然后就变默写了。。
#include<bits/stdc++.h>
#define clr(a,b) memset(a,b,sizeof(a))
#define fpn() freopen("simple.in","r",stdin)
#define rd read()
using namespace std;
typedef long long ll;
inline int read()
{
int x=,t=;char ch=getchar();
while((ch<''||ch>'')&&ch!='-')ch=getchar();
if(ch=='-')t=-,ch=getchar();
while(ch<=''&&ch>='')x=x*+ch-,ch=getchar();
return x*t;
}
const int maxn=;
int p=;
int ans[maxn],num[maxn],pri[maxn],cnt,l,tot;
int d[maxn],n,sum;
inline bool judge(int x){
for(int i=;i<=sqrt(x);i++){
if(x%i==)return false;
}
return true;
}
void prim(){
for(int i=;i<=;i++)
{
if(judge(i))pri[++cnt]=i;
}
}
void resolve(int x,int w){
for(int k=;k<=x;k++)
{
int a=k;
for(int i=;i<=cnt;i++){
if(a<=)break;
while(a%pri[i]==){
num[i]+=w;
a/=pri[i];
}
}
}
}
void mul(int x){
for(int i=;i<=l;i++)ans[i]*=x;
for(int i=;i<=l;i++){
ans[i+]+=ans[i]/p;
ans[i]%=p;
}
while(ans[l+]>){
l++;
ans[l+]+=ans[l]/p,ans[l]%=p;
}
}
void print()
{
for(int i=l;i>;i--)
if(i==l)printf("%d",ans[i]);
else printf("%06d",ans[i]);
}
int main(){
prim();
cin>>n;
if(n==){
int x;
cin>>x;
if(!x)printf("1\n");
else puts("");
return ;
}
int flag=;
for(int i=;i<=n;i++)
{
scanf("%d",&d[i]);
if(d[i]!=-){
if(d[i]==)flag=;
tot++;
sum+=d[i]-;
}
}
if(sum>n-||flag){
puts("");
return ;
}
resolve(n-,);
resolve(n--sum,-);
for(int i=;i<=n;i++){
if(d[i]!=-){
resolve(d[i]-,-);
}
}
ans[++l]=;
for(int i=;i<=cnt;i++){
while(num[i]--){
mul(pri[i]);
}
}
for(int i=;i<=n--sum;i++){
mul(n-tot);
}
print();
return ;
}
bzoj 1005: [HNOI2008]明明的烦恼 树的prufer序列+万进制的更多相关文章
- BZOJ 1005 [HNOI2008] 明明的烦恼(组合数学 Purfer Sequence)
题目大意 自从明明学了树的结构,就对奇怪的树产生了兴趣...... 给出标号为 1 到 N 的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为 N( ...
- BZOJ 1005: [HNOI2008]明明的烦恼 Purfer序列 大数
1005: [HNOI2008]明明的烦恼 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/ ...
- 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]明明的烦恼 (Prufer编码 + 组合数学 + 高精度)
1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5786 Solved: 2263[Submit][Stat ...
- BZOJ 1005 [HNOI2008]明明的烦恼 purfer序列,排列组合
1005: [HNOI2008]明明的烦恼 Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少 ...
- bzoj 1005 [HNOI2008] 明明的烦恼 (prufer编码)
[HNOI2008]明明的烦恼 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5907 Solved: 2305[Submit][Status][Di ...
- BZOJ 1005: [HNOI2008]明明的烦恼(prufer数列)
http://www.lydsy.com/JudgeOnline/problem.php?id=1005 题意: Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标 ...
- BZOJ 1005 [HNOI2008]明明的烦恼 ★(Prufer数列)
题意 N个点,有些点有度数限制,问这些点可以构成几棵不同的树. 思路 [Prufer数列] Prufer数列是无根树的一种数列.在组合数学中,Prufer数列是由一个对于顶点标过号的树转化来的数列,点 ...
随机推荐
- Springboot21 整合redis、利用redis实现消息队列
1 前提准备 1.1 创建一个springboot项目 技巧01:本博文基于springboot2.0创建 1.2 安装redis 1.2.1 linux版本 参考博文 1.2.2 windows版本 ...
- Linuc bazaar命令
一.简介 Bazaar 是一种强大的新一代源代码控制系统,它能够适用于所有主流操作系统,能够适应任何开发团队的工作模式. 二.安装 1)yum方式 yum install -y bzr 三.教 ...
- 登录xdebug
1.配置 2.先不打断点,调至登录页面 3.在登录必经过处打断点,访问页面输入账号密码点击登录,进入代码追踪模式
- PHP加密与解密
password_hash ( string $password , integer $algo [, array $options ] ) 加密,生成60位得字符串 $algo:一个用来在散列密码时 ...
- 复习扩展方法 涉及委托,这里我使用自定义委托类型 public delegate bb MyFunc<in T,out bb> (T arg)
using System;using System.Collections.Generic;using System.Data;using System.Linq;using System.Text; ...
- Socket接口原理及用C#语言实现
首先从原理上解释一下采用Socket接口的网络通讯,这里以最常用的C/S模式作为范例,首先,服务端有一个进程(或多个进程)在指定的端口等待客户来连接,服务程序等待客户的连接信息,一旦连接上之后,就可以 ...
- 编写高质量代码改善C#程序的157个建议——建议25:谨慎集合属性的可写操作
建议25:谨慎集合属性的可写操作 如果类型的属性中有集合属性,那么应该保证属性对象是由类型本身产生的.如果将属性设置为可写,则会增加抛出异常的几率.一般情况下,如果集合属性没有值,则它返回的Count ...
- Java Thread.join()详解--父线程等待子线程结束后再结束
目录(?)[+] 阅读目录 一.使用方式. 二.为什么要用join()方法 三.join方法的作用 join 四.用实例来理解 打印结果: 打印结果: 五.从源码看join()方法 join是Th ...
- 对于网站,APP开发流程的理解
• 明确产品目标用户,目标市场 • 明确将要开发的产品面世后是要解决什么样的问题 • 梳理产品有哪些功能点,功能点如何按照模块划分 • 站在用户角度思考用户怎样使用这款产品,以故事的情景讲述用户如何使 ...
- Extjs Ext.TreePanel
TreePanel 简单实例. <link rel="stylesheet" href="Js/ext-4.2/resources/css/ext-all-nept ...