zoukankan      html  css  js  c++  java
  • 【[SCOI2010]生成字符串】

    (n=m)时候经典的卡特兰

    (n!=m)呢,还是按照卡特兰的方式来推

    首先总情况数就是(inom{n+m}{n}),在(n+m)个里选择(n)(1)

    显然有不合法的情况,减掉它们

    对于一种不合法的情况,必然存在一个前缀(0)的个数比(1)(1)

    我们考虑构造出一个由(n+1)(1)(m-1)(0)组成的序列,其必然存在一个前缀使得(1)的个数比(0)(1)

    于是就能一一对应了

    也可以这样理解,对于每一个不合法的情况,找到第一个不合法的前缀,将其取反,之后就会得到一个(n+1)(1)(m-1)(0)组成的字符串,还是可以一一对应

    答案就是(inom{n+m}{n}-inom{n+m}{n+1})

    代码

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #define LL long long
    #define re register
    #define maxn 1000005
    const LL mod=20100403;
    LL n,m,fac[maxn*2];
    inline int read()
    {
    	char c=getchar();
    	int x=0;
    	while(c<'0'||c>'9') c=getchar();
    	while(c>='0'&&c<='9')
    		x=(x<<3)+(x<<1)+c-48,c=getchar();
    	return x;
    }
    LL exgcd(LL a,LL b,LL &x,LL &y)
    {
    	if(!b) return x=1,y=0,a;
    	LL r=exgcd(b,a%b,y,x);
    	y-=a/b*x;
    	return r;
    }
    inline LL inv(LL a)
    {
    	LL x,y;
    	LL r=exgcd(a,mod,x,y);
    	return (x%mod+mod)%mod;
    }
    inline LL C(LL n,LL m)
    {
    	if(m>n) return 0;
    	return (fac[n])*inv(fac[m]*fac[n-m]%mod)%mod;
    }
    int main()
    {
    	n=read(),m=read();
    	fac[0]=1;
    	for(re int i=1;i<=n+m;i++) fac[i]=(fac[i-1]*i)%mod;
    	printf("%lld
    ",(C(n+m,n)-C(n+m,n+1)+mod)%mod);
    	return 0; 
    }
    
  • 相关阅读:
    10.22(day11) Object类 异常
    10.19(day10)
    10.18(day9)内部类 抽象类 接口
    10.17(day8) Static关键字 包的使用 访问修饰符的权限 设计模式
    paho-mqtt error1: incorrect protocol version解决方法
    Python进阶-pickle/eval/exec
    关联分析算法Apriori和FP-Growth
    LOF聚类分析
    Python进阶-迭代器和生成器
    Linux常见坑
  • 原文地址:https://www.cnblogs.com/asuldb/p/10207901.html
Copyright © 2011-2022 走看看