26524中位数第二人生_计数原理与排列组合是选修几

26524中位数第二人生_计数原理与排列组合是选修几洛谷P2606 [ZJOI2010]排列计数(组合数 dp)

大家好,又见面了,我是你们的朋友全栈君。

题意

题目链接

称一个1,2,…,N的排列P1,P2…,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,…N的排列中有多少是Magic的,答案可能很大,只能输出模P以后的值

Sol

这辈子做不出的计数系列。

一眼小根堆没啥好说的。最关键的一点是:树的形态是可以递推出来的。

那么当前点$i$为根节点,大小为$siz[i]$,左/右儿子分别为$ls, rs$

那么$f[i] = C_{siz[i] – 1}^{siz[ls]} f[ls] \times f[rs]$

Lucas定理算组合数

#include<cstdio>
//#define int long long 
using namespace std;
const int MAXN = 1e6 + 10;
inline int read() {
    char c = getchar(); int x = 0, f = 1;
    while(c < '0' || c > '9') {
   
   if(c == '-') f = -1; c = getchar();}
    while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
    return x * f;
}
int N, P, fac[MAXN] = {
   
   1}, ifac[MAXN], siz[MAXN], f[MAXN];
int fastpow(int a, int p, int mod) {
    int base = 1;
    while(p) {
        if(p & 1) base = (1ll * base % mod * a % mod) % mod;
        a = (1ll * a % mod * a % mod) % mod; p >>= 1;
    }
    return base % mod;
}
int C(int N, int M, int P) {
    if(M > N) return 0;
    return 1ll * fac[N] % P * ifac[M] % P * ifac[N - M] % P;
}
int Lucas(int N, int M, int P) {
    if(!N || !M) return 1;
    return Lucas(N / P, M / P, P) * C(N % P, M % P, P);    
}
main() {
    N = read(); P = read();
    for(int i = 1; i <= N; i++) fac[i] = 1ll * i * fac[i - 1] % P;
    ifac[N] = fastpow(fac[N], P - 2, P);
    for(int i = N; i >= 1; i--) ifac[i - 1] = 1ll * i * ifac[i] % P;
    for(int i = N; i >= 1; i--) {
        siz[i] = 1;
        int ls = (i << 1), rs = (i << 1 | 1);
        if(rs <= N) siz[i] += siz[ls] + siz[rs], f[i] = 1ll * Lucas(siz[i] - 1, siz[ls], P) * f[ls] % P * f[rs] % P;    
        else if(ls <= N) siz[i] += siz[ls], f[i] = f[ls];
        else f[i] = 1;
    }
    printf("%d", f[1]);
    return 0;
}
/*
999999 1000000007
*/

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107306.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • telnet步骤_新手使用iphone教程

    telnet步骤_新手使用iphone教程telnet经常用于测试网络及端口占用情况。具体使用如下:测试端口命令:telnethost端口例:telnet192.168.31.1008081连接失败表示端口未占用。否则表示被占用,如下(8080端口已占用):例:telnet192.168.31.1008080使用快捷键:CTRL+]显示欢迎页面回车输入/会有请求头提示信息。  远…

    2022年9月16日
    3
  • idea git 使用(idea开发工具怎么使用)

    简介以下会介绍Git在IDEA中的使用,包含大多数的开发场景,这里是用Github做远程仓库,假设小组中有两个人,队长A,和队员B场景一:队长A创建项目并提交到远程Git仓库场景二:队员B从远程Git仓库上获取项目源码场景三:队员B修改了部分源码,提交到远程仓库场景四:队长A从远程仓库获取队员B的提交场景五:队员B接受了一个新功能的任务,创建了一个分支并在分支上开发场景六:队员B把…

    2022年4月17日
    53
  • 正则表达式验证手机号码格式_正则表达式身份证校验

    正则表达式验证手机号码格式_正则表达式身份证校验importrepatt=r’(13[4-9]\d{8,})KaTeXparseerror:Undefinedcontrolsequence:\datposition12:|(15[01289]\̲d̲{8,})’mobile=str(input(‘请输入手机号码:’))match=re.match(patt,mobile)ifmatch==None:print(mobile,“不是有效的中国移动手机号码。”)else:print(mobile,“是有效的中国移动手机号

    2022年9月17日
    2
  • 键盘enter事件时间页面绑定

    键盘enter事件时间页面绑定

    2022年1月9日
    51
  • Oracle初学者-常用工具介绍

    Oracle初学者-常用工具介绍

    2021年8月16日
    51
  • 长春python编程培训学校

    长春python编程培训学校近年来,教育部频频下发相关政策,强调编程教育的重要性,探究编程教育发展的新方式。从政策出台的趋势看,编程教育列入基础教育的趋势越来越大。在今年(2020年),教育部及各个省市又都下发了什么政策我们正好借着这个机会来盘点一下2020年各地编程教育政策汇总2020年2月教育部教育部公布了《2019年度普通高等学校本科专业备案和审批结果》,确定通过人工智能专业审批的高校达到180所。2020年4月四川四川省教育厅发布《关于加强初中学业水平考试命…

    2022年5月16日
    43

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号