BZOJ 2111 [ZJOI2010]Perm 排列计数:Tree dp + Lucas定理
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2111
题意:
给定n,p,问你有多少个1到n的排列P,对于任意整数i∈[2,n]满足P[i]>P[i/2]。
保证p为质数,输出答案 mod p的值。(n <= 10^6, p <= 10^9)
题解:
对于每个i,分别向i*2和i*2+1连一条边。
可以发现,最终形成的是一棵以1为根节点的二叉树。
题目中P[i]>P[i/2]的条件,就变成了:P[fa]<P[son]
然后就可以dp了。
表示状态:
dp[i]表示对于i的子树来说,填入1到siz[i]这些数,并且满足条件的方案数。
找出答案:
ans = dp[1]
如何转移:
对于i的子树来说,显然节点i只能填1。
所以首先考虑的就是将2到siz[i]这些数分配给两个子树的方案数。
设l = i*2, r = i*2+1,则方案数显然为C(siz[i]-1, siz[l])。
所以dp[i] = C(siz[i]-1, siz[l]) * dp[l] * dp[r]
边界条件:
dp[leaf] = siz[leaf] = 1
因为dp转移中要求组合数:C(n,m) = fact[n] * inv(fact[m]) * inv(fact[n-m])
然而给定的p可能很小,以至于与要求逆元的数不互质。
所以要用到Lucas定理求组合数:C(n,m)%p = C(n%p,m%p) * lucas(n/p,m/p) % p
AC Code:
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 1000005
#define int ll using namespace std; typedef long long ll; int n,p;
int f[MAX_N];
int dp[MAX_N];
int siz[MAX_N]; void cal_f()
{
f[]=;
for(int i=;i<=n;i++) f[i]=f[i-]*i%p;
} void exgcd(int a,int b,int &x,int &y)
{
if(b==)
{
x=,y=;
return;
}
exgcd(b,a%b,y,x);
y-=(a/b)*x;
} int inv(int a)
{
int x,y;
exgcd(a,p,x,y);
return (x%p+p)%p;
} int c(int n,int m)
{
if(n<m) return ;
return f[n]*inv(f[m])%p*inv(f[n-m])%p;
} int lucas(int n,int m)
{
if(m==) return ;
return c(n%p,m%p)*lucas(n/p,m/p)%p;
} void dfs(int x)
{
dp[x]=siz[x]=;
int l=(x<<),r=((x<<)|);
if(l<=n) dfs(l),siz[x]+=siz[l],dp[x]=dp[x]*dp[l]%p;
if(r<=n) dfs(r),siz[x]+=siz[r],dp[x]=dp[x]*dp[r]%p;
if(l<=n) dp[x]=dp[x]*lucas(siz[x]-,siz[l])%p;
} signed main()
{
cin>>n>>p;
cal_f();
dfs();
cout<<dp[]<<endl;
}
BZOJ 2111 [ZJOI2010]Perm 排列计数:Tree dp + Lucas定理的更多相关文章
- bzoj 2111 [ZJOI2010]Perm 排列计数(DP+lucas定理)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2111 [题意] 给定n,问1..n的排列中有多少个可以构成小根堆. [思路] 设f[i ...
- bzoj 2111: [ZJOI2010]Perm 排列计数 (dp+卢卡斯定理)
bzoj 2111: [ZJOI2010]Perm 排列计数 1 ≤ N ≤ 10^6, P≤ 10^9 题意:求1~N的排列有多少种小根堆 1: #include<cstdio> 2: ...
- BZOJ 2111: [ZJOI2010]Perm 排列计数 [Lucas定理]
2111: [ZJOI2010]Perm 排列计数 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1936 Solved: 477[Submit][ ...
- bzoj 2111: [ZJOI2010]Perm 排列计数【树形dp+lucas】
是我想复杂了 首先发现大于关系构成了一棵二叉树的结构,于是树形dp 设f[i]为i点的方案数,si[i]为i点的子树大小,递推式是\( f[i]=f[i*2]*f[i*2+1]*C_{si[i]-1} ...
- bzoj 2111: [ZJOI2010]Perm 排列计数 Lucas
题意:称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能很大, ...
- bzoj 2111: [ZJOI2010]Perm 排列计数
神题... 扒自某神犇题解: http://blog.csdn.net/aarongzk/article/details/50655471 #include<bits/stdc++.h> ...
- 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+排列组合+lucas
[题目]BZOJ 2111 [题意]求有多少1~n的排列,满足\(A_i>A_{\frac{i}{2}}\),输出对p取模的结果.\(n \leq 10^6,p \leq 10^9\),p是素数 ...
- 【BZOJ2111】[ZJOI2010]Perm 排列计数 组合数
[BZOJ2111][ZJOI2010]Perm 排列计数 Description 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi> ...
随机推荐
- CSS ,浮动,clear记录,和一些转载别处
DIV+CSS clear both清除产生浮动 我们知道有时使用了css float浮动会产生css浮动,这个时候就需要清理清除浮动,我们就用clear样式属性即可实现. clear 属性规定元素的 ...
- 问题:Unable to find a 'userdata.img' file for ABI armeabi to copy into the AVD folder.
创建AVD时,发现创建不成功,报错“Unable to find a 'userdata.img' file for ABIarmeabi to copy into the AVD folder.” ...
- VS中没有为此解决方案配置选中要生成的项目
菜单->生成->配置管理器->给要生成的项目打钩
- OpenCV3计算机视觉+python(三)
使用OpenCV3处理图像 下面要介绍的内容都与图像处理有关,这时需要修改图像,比如要使用具有艺术性的滤镜.外插(extrapolate)某些部分.分割.粘贴或其他需要的操作. 不同色彩空间的转换 O ...
- MySQL中kill所有慢查询进程和锁表进程
1.kill所有慢查询进程: #!/bin/bash mysql -uroot -pMy_Password -e "show processlist" | grep -i &quo ...
- 【zabbix】zabbix忘记密码,重置密码
忘记密码这种事经常会发生,这里我们介绍一种zabbix忘记用户密码的处理方式. 原理: zabbix存储在数据库中用户名密码是经过32位,小写,md5加密过的.我们可以手动修改数据库中用户的密码. 实 ...
- python如何实现多线程
一个线程就是一个轻量级进程,多线程能让我们一次执行多个线程. python是多线程语言,其内置有多线程工具包 python中GIL(全局解释器锁)确保一次执行单个线程.一个线程保存GIL并在将其传递给 ...
- jQuery:自学笔记(5)——Ajax
jQuery:自学笔记(5)——Ajax 使用Ajax快捷函数 说明 出于简化AJAX开发工作的流程,jQuery提供了若干了快捷函数. 实例 1.显示 test.php 返回值(HTML 或 XML ...
- Cookie用法简介
java操作Cookie---javax.servlet.http.Cookie 1.增加一个Cookie Cookie cookie = new Cookie("username" ...
- Keepalived 主备配置
keepalived主备或多主多备,配置都是一样配置方法,只是搭建多少的问题. 1.keepalived安装 参考:https://www.cnblogs.com/zwcry/p/9542867.ht ...