zoukankan      html  css  js  c++  java
  • 【BZOJ2111】[ZJOI2010]排列计数(组合数学)

    【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
    ",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;
    }
    
  • 相关阅读:
    Windows打开文件后提示,文件或目录损坏无法读取。
    windows10 提示内存不足
    配置Redis集群为开机自启动
    Hbase的rowkey设计
    Hbase表类型的设计
    mycat的下载和安装
    mycat简介
    mysql|tomcat|nginx|redis在docker中的部署
    docker的备份和迁移
    Redis Cluster集群详介绍和伪集群搭建
  • 原文地址:https://www.cnblogs.com/cjyyb/p/9873558.html
Copyright © 2011-2022 走看看