BZOJ2111: [ZJOI2010]Perm 排列计数
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2111
题意:一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能很大,只能输出模P以后的值
题解:注意到形成一个树状结构,如果不妨设f[i]为i所在子树分配s[i]个节点的方案数。
那么有递推式:f[i]=f[i<<1]*f[i<<1|1]*c(s[i]-1,s[i<<1])
然后就lucas定理算算组合数就可以了。
代码:
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<string>
#define inf 1000000000
#define maxn 2000000+5
#define maxm 200000+5
#define eps 1e-10
#define ll long long
#define pa pair<int,int>
#define for0(i,n) for(int i=0;i<=(n);i++)
#define for1(i,n) for(int i=1;i<=(n);i++)
#define for2(i,x,y) for(int i=(x);i<=(y);i++)
#define for3(i,x,y) for(int i=(x);i>=(y);i--)
#define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)
#define for5(n,m) for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)
#define mod 1000000007
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}
return x*f;
}
int s[maxn];
ll n,m,p,f[maxn],fac[maxn],inv[maxn];
inline ll c(int n,int m)
{
if(n<m)return ;
if(n<p&&m<p)return fac[n]*inv[m]%p*inv[n-m]%p;
return c(n/p,m/p)*c(n%p,m%p)%p;
}
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
n=read();p=read();m=min(n,p-);
fac[]=;
for1(i,m)fac[i]=fac[i-]*(ll)i%p;
inv[]=inv[]=;
for2(i,,m)inv[i]=(ll)(p/i+)*inv[i-p%i]%p;
for2(i,,m)inv[i]=inv[i]*inv[i-]%p;
for3(i,n,)
{
s[i]=s[i<<]+s[i<<|]+;
f[i]=((i<<)>n?:f[i<<])*((i<<|)>n?:f[i<<|])%p*c(s[i]-,s[i<<])%p;
}
cout<<f[]<<endl;
return ;
}
BZOJ2111: [ZJOI2010]Perm 排列计数的更多相关文章
- [BZOJ2111][ZJOI2010]Perm排列计数(组合数学)
题意就是求一个n个点的堆的合法形态数. 显然,给定堆中所有数的集合,则这个堆的根是确定的,而由于堆是完全二叉树,所以每个点左右子树的大小也是确定的. 设以i为根的堆的形态数为F(i),所以F(i)+= ...
- [bzoj2111][ZJOI2010]Perm 排列计数 ——问题转换,建立数学模型
题目大意 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能很 ...
- [BZOJ2111]:[ZJOI2010]Perm 排列计数(组合数学)
题目传送门 题目描述 称一个1,2,...,N的排列${P}_{1}$,${P}_{2}$,...,${P}_{N}$是Magic的,当且仅当2≤i≤N时,${P}_{i}$>${P}_{\fr ...
- 【BZOJ2111】[ZJOI2010]Perm 排列计数 组合数
[BZOJ2111][ZJOI2010]Perm 排列计数 Description 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi> ...
- BZOJ 2111: [ZJOI2010]Perm 排列计数 [Lucas定理]
2111: [ZJOI2010]Perm 排列计数 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1936 Solved: 477[Submit][ ...
- 2111: [ZJOI2010]Perm 排列计数
2111: [ZJOI2010]Perm 排列计数 链接 题意: 称一个1,2,...,N的排列$P_1,P_2...,P_n$是Magic的,当且仅当$2<=i<=N$时,$P_i> ...
- bzoj 2111: [ZJOI2010]Perm 排列计数 (dp+卢卡斯定理)
bzoj 2111: [ZJOI2010]Perm 排列计数 1 ≤ N ≤ 10^6, P≤ 10^9 题意:求1~N的排列有多少种小根堆 1: #include<cstdio> 2: ...
- 【bzoj2111】[ZJOI2010]Perm 排列计数 dp+Lucas定理
题目描述 称一个1,2,...,N的排列P1,P2...,Pn是Mogic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Mogic的,答案可能很 ...
- 【BZOJ】2111: [ZJOI2010]Perm 排列计数 计数DP+排列组合+lucas
[题目]BZOJ 2111 [题意]求有多少1~n的排列,满足\(A_i>A_{\frac{i}{2}}\),输出对p取模的结果.\(n \leq 10^6,p \leq 10^9\),p是素数 ...
随机推荐
- Flash设置全屏后,放到网页中显示不正常
stage.displayState = StageDisplayState.FULL_SCREEN;//全屏,注意当设置全屏后,放到网页中显示不正常
- RabbitMQ学习(1):安装
1.安装 Erlang,官网:https://www.erlang.org/ 2.安装RabbitMQ服务器,rabbitMQ server,官网http://www.rabbitmq.com/ 注: ...
- Java多线程——<六>更方便的线程
一.概述 标题很抽象,什么叫更方便?更是相比谁来说的呢? 原来,我们定义任务,都是实现自Runnable或者Callable接口,但是这样必然需要你将新定义的任务附着给线程,然后再调用线程启动.在不考 ...
- javaee web项目的目录结构
一般web系统的目录结构如下,其中src下的包结构和webroot下(除meta-inf和web-inf)的文件夹可以根据自己的项目实际调整,但是javaee规范的大目录结构不会变: META-INF ...
- MATLAB——PLOT绘图
MATLAB——PLOT绘图 格式化绘图: 1.color: b g r c m y k w blue green red cyan magenta yellow black white 2.ty ...
- hdu 4888
网络流建模,建模不难,难在找环: #include<cstdio> #include<algorithm> #include<vector> #include< ...
- Indent Guides VS 插件 对齐线
- IDataParameter[]
IDataParameter[]简单的说来,就是可以包含任何数据库参数的数组,这些参数可以是SqlParameter或者OleDbParameter,但是,IDataParameter[]不可以直接从 ...
- 【mysql的编程专题③】内置函数
数学函数 常用 abs(x) 返回x的绝对值 floor(x) 返回小于x的最大整数值 mod(x,y) 返回x/y的模(余数) rand() 返回0到1内的随机值,可以通过提供一个参数(种子)使ra ...
- Mysql数据库int(1)和tinyint(1)的区别&&扩展阅读
转自:http://blog.csdn.net/phpwish/article/details/7845921 今天看项目的数据库结构设计,发现一个奇怪的地方. `xxx_detail` `del ...