【BZOJ2111】[ZJOI2010]排列计数(组合数学)

题面

BZOJ

洛谷

题解

就是今年九省联考\(D1T2\)的弱化版?

直接递归组合数算就好了。

注意一下模数可以小于\(n\),所以要存一下乘了几个零才行。

#include<iostream>
#include<cstdio>
using namespace std;
#define ll long long
#define MAX 1000100
#define ls (u<<1)
#define rs (u<<1|1)
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n,MOD;
struct Int{int x,y;}jc[MAX],jv[MAX],inv[MAX];
Int operator*(Int a,Int b){return (Int){1ll*a.x*b.x%MOD,a.y+b.y};}
Int operator*(Int a,int b){b%=MOD;if(!b)a.y+=1;else a.x=1ll*a.x*b%MOD;return a;}
int sz[MAX<<2];
Int C(int n,int m){return jc[n]*jv[m]*jv[n-m];}
void dfs(int u)
{
sz[u]=1;
if(ls<=n)dfs(ls),sz[u]+=sz[ls];
if(rs<=n)dfs(rs),sz[u]+=sz[rs];
}
Int DFS(int u)
{
if(u>n)return (Int){1,0};
return DFS(ls)*DFS(rs)*C(sz[u]-1,sz[ls]);
}
void output(Int a){if(a.y)puts("0");else printf("%d\n",a.x);}
int main()
{
n=read();MOD=read();
jc[0]=jv[0]=inv[0]=inv[1]=(Int){1,0};
for(int i=2;i<=n;++i)
if(i<MOD)inv[i]=inv[MOD%i]*(MOD-MOD/i);
else if(i%MOD)inv[i]=inv[i-MOD];
else inv[i].y=1,inv[i].x=1;
for(int i=1;i<=n;++i)inv[i].y*=-1;
for(int i=1;i<=n;++i)jc[i]=jc[i-1]*i;
for(int i=1;i<=n;++i)jv[i]=jv[i-1]*inv[i];
dfs(1);output(DFS(1));
return 0;
}

【BZOJ2111】[ZJOI2010]排列计数(组合数学)的更多相关文章

  1. bzoj2111 [ZJOI2010]排列计数

    Description 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic ...

  2. 洛谷P2606 [ZJOI2010]排列计数 组合数学+DP

    题意:称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能很大, ...

  3. BZOJ2111 ZJOI2010排列计数

    根据Pi>Pi/2可以看出来这是一个二叉树 所以我们可以用树形DP的思想 f[i]=f[i<<1]*f[i<<1|1]*C(s[i]-1,s[i<<1]),s ...

  4. [ZJOI2010]排列计数 (组合计数/dp)

    [ZJOI2010]排列计数 题目描述 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有 ...

  5. 洛谷 P2606 [ZJOI2010]排列计数 解题报告

    P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...

  6. P2606 [ZJOI2010]排列计数

    P2606 [ZJOI2010]排列计数 因为每个结点至多有一个前驱,所以我们可以发现这是一个二叉树.现在我们要求的就是以1为根的二叉树中,有多少种情况,满足小根堆的性质. 设\(f(i)\)表示以\ ...

  7. bzoj-4517 4517: [Sdoi2016]排列计数(组合数学)

    题目链接: 4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 846  Solved: 530[Submit][ ...

  8. 洛谷P4071 [SDOI2016] 排列计数 [组合数学]

    题目传送门 排列计数 题目描述 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m ...

  9. [SDOI2016] 排列计数 (组合数学)

    [SDOI2016]排列计数 题目描述 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰 ...

随机推荐

  1. ios中@class和 #import区别

    很多刚开始学习iOS开发的同学可能在看别人的代码的时候会发现有部分#import操作写在m文件中,而h文件仅仅使用@class进行声明,不禁纳闷起来,为什么不直接把#import放到h文件中呢?这是因 ...

  2. jquery点赞和取消点赞插件

    <script> /* @author:Romey * 动态点赞 * 此效果包含css3,部分浏览器不兼容(如:IE10以下的版本) */ $(function(){ $("#p ...

  3. [2]Telerik Extensions for ASP.NET MVC 中文教程(2)

    上一篇文章对Telerik MVC Extensions作了一个大概的介绍,这篇文章将介绍如何将Telerik MVC Extensions添加到项目中.有以下两种方式可以将Telerik MVC E ...

  4. Codeforces Round #354 (Div. 2) C. Vasya and String

    题目链接: http://codeforces.com/contest/676/problem/C 题解: 把连续的一段压缩成一个数,对新的数组求前缀和,用两个指针从左到右线性扫一遍. 一段值改变一部 ...

  5. EasyUI-Tab 标签添加右键菜单

    在网上看了很多demo 自己实现了一个效果如下 <!doctype html> <html> <head> <meta http-equiv="co ...

  6. WebService积累

    1.缺点,无法传输复杂对象:如无法序列化key/value结构的类型参数以及相关一维集合接口(Hashtable等打上标签[Serializable]即可序列化,不过继承的IDictionary并不可 ...

  7. 关于百度地图API的地图坐标转换问题

    原文:关于百度地图API的地图坐标转换问题 我在之前的文章利用html5获取经纬度并且在百度地图中显示位置中使用了百度地图的API来显示html5获取的地理位置,在文中我说过这样的话,我说百度地图的准 ...

  8. kvstore存储介质redis代码

    <?php /** * ShopEx licence * * @copyright Copyright (c) 2005-2010 ShopEx Technologies Inc. (http: ...

  9. DFS和BFS(无向图)Java实现

    package practice; import java.util.Iterator; import java.util.Stack; import edu.princeton.cs.algs4.* ...

  10. Centos 7.3 编译 &amp; 安装 &amp; 测试 facebook faiss

    许多 AI 系统训练完毕,正式上线时的基本操作往往可以抽象为:在高维向量空间中,给定一个向量,寻找与之最相近的 k 个向量.当向量数目异常巨大时,如何快速地执行这一基本操作,便成为 AI 系统在工程应 ...