bzoj1005: [HNOI2008]明明的烦恼(prufer+高精度)
1005: [HNOI2008]明明的烦恼
题目:传送门
题解:
毒瘤题啊天~
其实思考的过程还是比较简单的。。。
首先当然还是要了解好prufer序列的基本性质啦
那么和1211大体一致,主要还是利用组合数学:
首先我们把度数和-n记录为sum,那么根据prufer序列,序列的元素个数就是n-2
那就是要在n-2个位置中选sum个,然后就是分别根据度数要求算每个元素在sum个位置中的方案,然后乘起来。最后还要乘上没有度数要求的元素的方案数就...ok啦
思考两分钟...代码两小时...太菜啦!!!!
代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define qread(x) x=read()
using namespace std;
inline int read()
{
int f=,x=;char ch;
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return f*x;
}
struct node
{
int len,a[];
node(){memset(a,,sizeof(a));}
}no,n1;
void chengfa(int x)
{
int i;
for(i=;i<=no.len;i++)no.a[i]=no.a[i]*x;
for(i=;i<=no.len;i++)
{
no.a[i+]+=no.a[i]/;
no.a[i]%=;
}
i=no.len;
while(no.a[i+]>)
{
i++;
no.a[i+]+=no.a[i]/;
no.a[i]%=;
}
no.len=i;
while(no.a[no.len]== && no.len>)no.len--;
}
bool pd(int x)
{
if(x<)return false;
double t=sqrt(double(x+));
for(int i=;i<=t;i++)
if(x%i==)
return false;
return true;
}
int n,d[],pr[],s[];
int main()
{
scanf("%d",&n);int cnt=,sum=;
if(n==){qread(d[]);if(d[]){printf("0\n");return ;}else {printf("1\n");return ;}}
for(int i=;i<=n;i++)
{
qread(d[i]);
if(d[i]==){printf("0\n");}
if(d[i]==-)cnt++;
else d[i]-=,sum+=d[i];
}
if(sum>n-){printf("0\n");return ;}
if(sum<n- && cnt==){printf("0\n");return ;}
int len=;
for(int i=;i<=n;i++)if(pd(i))pr[++len]=i;
for(int i=;i<=n-;i++)
{
int x=i;
for(int j=;j<=len;j++)
while(x%pr[j]== && x!=)
s[j]++,x/=pr[j];
}
for(int i=;i<=n--sum;i++)
{
int x=i;
for(int j=;j<=len;j++)
while(x%pr[j]== && x!=)
s[j]--,x/=pr[j];
}
for(int i=;i<=n;i++)
if(d[i]>)
{
for(int k=;k<=d[i];k++)
{
int x=k;
for(int j=;j<=len;j++)
while(x%pr[j]== && x!=)
s[j]--,x/=pr[j];
}
}
no.a[]=;no.len=;
for(int i=;i<=len;i++)
while(s[i]--)
chengfa(pr[i]);
for(int i=;i<=n--sum;i++)chengfa(cnt);
for(int i=no.len;i>=;i--)
printf("%d",no.a[i]);
printf("\n");
return ;
}
bzoj1005: [HNOI2008]明明的烦恼(prufer+高精度)的更多相关文章
- [bzoj1005][HNOI2008]明明的烦恼-Prufer编码+高精度
Brief Description 给出标号为1到N的点,以及某些点最终的度数,允许在 任意两点间连线,可产生多少棵度数满足要求的树? Algorithm Design 结论题. 首先可以参考这篇文章 ...
- [BZOJ1005] [HNOI2008] 明明的烦恼 (prufer编码)
Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为N ...
- bzoj1005: [HNOI2008]明明的烦恼 prufer序列
https://www.lydsy.com/JudgeOnline/problem.php?id=1005 给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的 ...
- BZOJ 1005 [HNOI2008]明明的烦恼 (Prufer编码 + 组合数学 + 高精度)
1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5786 Solved: 2263[Submit][Stat ...
- bzoj1005 [HNOI2008]明明的烦恼
1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3032 Solved: 1209 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] 明明的烦恼 (prufer编码)
[HNOI2008]明明的烦恼 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5907 Solved: 2305[Submit][Status][Di ...
- BZOJ1005 HNOI2008明明的烦恼(prufer+高精度)
每个点的度数=prufer序列中的出现次数+1,所以即每次选一些位置放上某个点,答案即一堆组合数相乘.记一下每个因子的贡献分解一下质因数高精度乘起来即可. #include<iostream&g ...
随机推荐
- Windows系统环境变量、JAVA环境变量配置以及JVM加载过程
一:用户变量和系统变量的区别 右击我的电脑.属性.高级系统设置.环境变量. 对话框的上面为Administrator的用户变量,对话框的下面为系统变量.我们所说的环境变量一般指系统环境变量,对所有用户 ...
- IBASE4J开发环境搭建
1.修改STS默认编码,Window > Perference > General > Workspace,将 text file encoding 设置为 UTF-8 2.打开 G ...
- C#一个托付的样例
C#中的函数能够被声明的一个托付所调用. 函数为静态方法.和托付声明的參数返回值要一致. class Program { delegate float MathOperationDelegate( ...
- 【POJ 1850】 Code
[POJ 1850] Code 还是非常想说 数位dp真的非常方便! !. 数位dp真的非常方便!.! 数位dp真的非常方便! !! 重要的事说三遍 该题转换规则跟进制差点儿相同 到z时进一位 如az ...
- Linux 截图
方法一:快捷键截图 对整个屏幕截图: PrintScreen 对活动窗体截图: Alt+PrintScreen 对随意矩形截图: Shift+PrintScreen 以上三个快捷键再加上Ctrl.就会 ...
- Unity学习笔记 之 发射小球碰撞物体的代码记录
绑定在摄像机上的脚本 using UnityEngine; using System.Collections; public class abc : MonoBehaviour { //设置移动速度 ...
- c++ STL unique , unique_copy函数
一.unique函数 类属性算法unique的作用是从输入序列中"删除"全部相邻的反复元素. 该算法删除相邻的反复元素.然后又一次排列输入范围内的元素,而且返回一个迭代器(容器的长 ...
- node16---cookie session
03.js var express = require("express"); var app = express(); var db = require("./mode ...
- Java中如何解决线程安全问题
给出一个问题,如下: 解决方案如下: public class Demo_5 { public static void main(String[] args) { //创建一个窗口 TicketWin ...
- 【原创】如何使用一句SQL计算工作日天数?
现在有这样一个需求,要求计算两个日期间的工作日天数,要求除去节假日,其中节假日有一张配置表,具体的格式如下: 开始日期 结束日期 节假日类型 节假日名称 2013-08-10 2013-08-12 ...