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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Android 代码设置RelativeLayout元素居中

    Android 代码设置RelativeLayout元素居中RelativeLayoutrelativeLayout=newRelativeLayout(this);RelativeLayout.LayoutParamsrlp=newRelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_C

    2022年7月17日
    13
  • ODS层设计规范_环境类别二类的保护层厚度是多少

    ODS层设计规范_环境类别二类的保护层厚度是多少ODS层设计规范更新时间:2021-06-0814:37我的收藏本页目录数据同步及处理规范 命名规范 数据存储及生命周期管理规范 数据质量规范本文为您介绍ODS层设计规范。数据同步及处理规范数据同步方式的选择 基本规范通过需求形式落地到DataWorks的数据集成,规范落地情况依赖工具的推进节奏。一个系统的源表只允许同步一次到MaxCompute。 数据加载与处理 通过一键实时同步至MaxCompute方案实现,请参见配置查看数据同步任务。 命名规范表命名

    2022年10月6日
    2
  • 年轻的采访可以学到很多东西

    年轻的采访可以学到很多东西

    2022年1月10日
    43
  • wxPython教程(二)

    wxPython教程(二)wxPython教程(二)—wxPython按钮要创建按钮,只需调用wx.Button()。使用wx.Button()创建按钮时,将面板解析为第一个参数非常重要。我们将它连接到面板上,因为连接到框架会使其全屏显示。面板使你可以选择将窗口小部件放置在窗口中的任何位置。参数(10,10)是面板上的位置。id参数是必需的,但它等于-1(wx.ID_ANY==-1)。第3个参数是按钮上的文本。你可以使用以下代码在wxPython中创建一个按钮:#!/usr/bin/python

    2022年5月21日
    31
  • dwcss样式中英对照_dw-cs5-css规则英汉对照表.docx

    dwcss样式中英对照_dw-cs5-css规则英汉对照表.docxdw-cs5-css规则英汉对照表.docx一、类型FONTFAMILY字体FONTSIZE字体大小FONTSTYLE字体风格,如斜体、正常等LINEHEIGHT行高(用来设定字行间距)FONTWEIGHT字体浓淡FONTVARIANT字体变量(用来设定字体是正常显示,还是以小型大写字母显示)TEXTTRANS文本转换(用来设定字体的大小写转换)TEXTDECORATION(字体装饰)UNDER…

    2022年5月17日
    44
  • ora-01006:绑定变量不存在_输出参数不是绑定变量

    ora-01006:绑定变量不存在_输出参数不是绑定变量  #命令行新建job错误:ORA-01008并非所有变量都已绑定。 1、改正前代码:DECLAREjobNUMBER;begin      sys.dbms_job.submit(job=&gt;:job, what=&gt;’P_AUTO_FETCH_RECORDS;’, next_date=&gt;to_…

    2022年9月6日
    4

发表回复

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

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