【题目链接】:http://www.lydsy.com/JudgeOnline/problem.php?id=1005

【题意】

【题解】



题目和题解在上一篇;

这里 对

【(m^(n-2-tot))* (n-2)!】/【(n-2-tot)!* (d[1]-1)!*(d[2]-1)!……(d[n]-1)!】;

这个式子的化简再说一个方法;

对于n!

最后分解成质因子的时候;

质因子p的指数应该为

∑(n/i);

这里i为p,p^2,p^3….p^x,且p^x<=n

这样;

因为最大要求的阶乘为(n-2)!

所以先处理出2..n-2之间哪些数是质数;

然后对于x!

直接枚举2..x之间的那些质数;

然后i=p,p平方,p立方,p的4次方..那样加上n/i;

知道某个质数的指数之后,直接根据是分子还是分母,分别加上或减去那个∑(n/i)就好;

这样就不用1..x里面每个数都再去分解一次质因数了;

//直接暴力搞
for (int i = 1;i <= x;i++)
{
int x = i;
for (int j= 2;j*j <= x;j++)
while (x%j==0)
{
cnt[j]->change;
x/=j;
}
}
//更优雅的方法
for (int i = 2;i <= x;i++)
{
if (zhishu[i])
{
zhi=0
for (int j = i;j <= x;;j*=i)
zhi+=x/j;
cnt[i]->change(zhi);
}
}

【完整代码】

/**************************************************************
Problem: 1005
User: chengchunyang
Language: C++
Result: Accepted
Time:36 ms
Memory:1316 kb
****************************************************************/ #include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%I64d",&x) typedef pair<int,int> pii;
typedef pair<LL,LL> pll; const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 1100; int n,d[N],m,tot,cnt[N];
int ans[N],len = 1;
bool bo[N]; void go(int t,int x)
{
rep1(i,2,t)
if (bo[i])
{
int num = 0;
for (int j = i;j <= t;j*=i)
num+=t/j;
cnt[i]+=x*num;
}
} void cheng(int p)
{
int x = 0;
rep1(i,1,len)
{
ans[i] = ans[i]*p+x;
x = ans[i]/10;
ans[i]%=10;
}
while (x>0)
{
ans[++len] = x;
x = ans[len]/10;
ans[len]%=10;
}
} bool is(int x)
{
rep1(i,2,int(sqrt(x)))
if (x%i==0)
return false;
return true;
} int main()
{
//freopen("F:\\rush.txt","r",stdin);
rei(n);
rep1(i,1,n)
{
rei(d[i]);
if (d[i]==0) return puts("0"),0;
if (d[i]==-1)
m++;
else
d[i]--,tot+=d[i];
}
if (n-2<tot)
return puts("0"),0;
memset(bo,false,sizeof bo);
rep1(i,2,n-2)
if (is(i)) bo[i] = true;
go(n-2,1);
go(n-2-tot,-1);
rep1(i,1,n)
go(d[i],-1);
ans[1] = 1;
rep1(i,2,n)
rep1(j,1,cnt[i])
cheng(i);
rep1(i,1,n-2-tot)
cheng(m);
rep2(i,len,1)
printf("%d",ans[i]);
return 0;
}


【BZOJ 1005】[HNOI2008]明明的烦恼(化简的另一种方法)的更多相关文章

  1. BZOJ 1005 [HNOI2008] 明明的烦恼(组合数学 Purfer Sequence)

    题目大意 自从明明学了树的结构,就对奇怪的树产生了兴趣...... 给出标号为 1 到 N 的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为 N( ...

  2. BZOJ 1005: [HNOI2008]明明的烦恼 Purfer序列 大数

    1005: [HNOI2008]明明的烦恼 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/ ...

  3. bzoj 1005: [HNOI2008]明明的烦恼 prufer编号&&生成树计数

    1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2248  Solved: 898[Submit][Statu ...

  4. BZOJ 1005: [HNOI2008]明明的烦恼( 组合数学 + 高精度 )

    首先要知道一种prufer数列的东西...一个prufer数列和一颗树对应..然后树上一个点的度数-1是这个点在prufer数列中出现次数..这样就转成一个排列组合的问题了.算个可重集的排列数和组合数 ...

  5. BZOJ 1005 [HNOI2008]明明的烦恼 (Prufer编码 + 组合数学 + 高精度)

    1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 5786  Solved: 2263[Submit][Stat ...

  6. BZOJ 1005 [HNOI2008]明明的烦恼 purfer序列,排列组合

    1005: [HNOI2008]明明的烦恼 Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少 ...

  7. bzoj 1005 [HNOI2008] 明明的烦恼 (prufer编码)

    [HNOI2008]明明的烦恼 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 5907  Solved: 2305[Submit][Status][Di ...

  8. BZOJ 1005: [HNOI2008]明明的烦恼(prufer数列)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1005 题意: Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标 ...

  9. BZOJ.1005.[HNOI2008]明明的烦恼(Prufer 高精 排列组合)

    题目链接 若点数确定那么ans = (n-2)!/[(d1-1)!(d2-1)!...(dn-1)!] 现在把那些不确定的点一起考虑(假设有m个),它们在Prufer序列中总出现数就是left=n-2 ...

随机推荐

  1. 1.Dubbo教程

    转自:https://blog.csdn.net/hellozpc/article/details/78575773 2. 什么是dubbo 2.1. 简介 DUBBO是一个分布式服务框架,致力于提供 ...

  2. GO语言学习(十五)Go 语言指针

    Go 语言指针 Go 语言中指针是很容易学习的,Go 语言中使用指针可以更简单的执行一些任务. 接下来让我们来一步步学习 Go 语言指针. 我们都知道,变量是一种使用方便的占位符,用于引用计算机内存地 ...

  3. crm翻译导航栏

    在crm里面怎样翻译导航栏? 过程例如以下: 1 先新建一个解决方式.把网站地图加进去 2: 然后把这个解决方式到出来来,解压文件: 3:编辑第二个文件: watermark/2/text/aHR0c ...

  4. 三个水杯(BFS)

    三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描写叙述 给出三个水杯.大小不一,而且仅仅有最大的水杯的水是装满的,其余两个为空杯子. 三个水杯之间相互倒水,而且水杯 ...

  5. springboot整合freemarker(转)

    添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sp ...

  6. WPF学习笔记——概述

    如果你选择WPF,多半原因是因为折服于它那震撼性的用户体验.纵观WPF整个知识体系,其内容并不复杂,但却比较细碎,不易理清.以下内容是对WPF部分内容的简单概括,希望读者能够对WPF框架有个大体认识. ...

  7. numpy 细节问题

    1. np.expand_dims >> X = np.random.randint(0, 9, (2, 3)) >> mean_X = np.mean(X, axis=0) ...

  8. 10.12 android输入系统_InputStage理论

    android应用程序对输入系统的处理分为多个阶段,我们把这些阶段称为InputStage 理论处理流程: (1)activity发给window,如果window不能处理,再由activity处理; ...

  9. [Angular] Angular Advanced Features - ng-template , ng-container, ngTemplateOutlet

    Previously we have tab-panel template defined like this: <ul class="tab-panel-buttons" ...

  10. js实现第一次打开网页弹出指定窗口(常用功能封装很好用)

    js实现第一次打开网页弹出指定窗口(常用功能封装很好用) 一.总结 1.常用功能封装:之前封装的cookie的操作函数非常好用,我自己也可以这么搞 二.js实现第一次打开网页弹出指定窗口 练习1:第一 ...