【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. 使用while和read命令读取文件内容

    转:使用while和read命令读取文件内容 1.准备数据文件 $cat a.txt 200:2 300:3 400:4 500:5 2.用while循环从文件中读取数据 #!/bin/ksh whi ...

  2. 懒人小工具1:winform自动生成Model,Insert,Select,Delete以及导出Excel的方法

       懒人小工具2:T4自动生成Model,Insert,Select,Delete以及导出Excel的方法    github地址:https://github.com/Jimmey-Jiang/J ...

  3. 分布式监控系统Zabbix--完整安装记录(7)-使用percona监控MySQL

    前面已经介绍了分布式监控系统Zabbix-3.0.3-完整安装记录(2)-添加mysql监控,但是没有提供可以直接使用的Key,太过简陋,监控效果不佳.要想更加仔细的监控Mysql,业内同学们都会选择 ...

  4. 牛客训练赛25-A-最长区间

    https://www.nowcoder.com/acm/contest/158#question 这题问最长的严格连续递增序列的最长长度是多少? 最开始感觉这道题不可做,因为有1e5个点,还有1e5 ...

  5. 《移山之道》Reading Task

    老师布置的阅读任务虽然是附加的作业,但是对我来说是个很好的学习机会.软件工程主要是对工程的开发进行学习,毕竟在学校老师教了那么多的知识,我们课下做了那么多的练习并没有提高我们做一个工程的能力.一个项目 ...

  6. Week 7 迭代总结

    写在前面: 本次我为团队博客写了一篇总结,深刻总结了我们组发生的问题以及将来要做的事情.有兴趣请移步http://www.cnblogs.com/Buaa-software Week 7 Alpha轮 ...

  7. [2019BUAA软件工程]第1次阅读作业

    [2019BUAA软件工程]第1次阅读作业 Tips Link 作业连接 [2019BUAA软件工程]第1次阅读作业 读<构建之法>的疑惑 个人开发流程(Personal Software ...

  8. JavaScript获取DOM节点

    常用的方法有 document.getElementById("id"); document.getElementsByTagName('tagName'); document.g ...

  9. Docker(十六)-Docker的daemon.json的作用

    docker安装后默认没有daemon.json这个配置文件,需要进行手动创建.配置文件的默认路径:/etc/docker/daemon.json 一般情况,配置文件 daemon.json中配置的项 ...

  10. 二叉排序树类的: C++ 实现

    #include<iostream> using namespace std; template<class T> struct TreeNode { T element; T ...