zoukankan      html  css  js  c++  java
  • BZOJ 1856: [Scoi2010]字符串 [Catalan数]

    1856: [Scoi2010]字符串

    Time Limit: 5 Sec  Memory Limit: 64 MB
    Submit: 1418  Solved: 790
    [Submit][Status][Discuss]

    Description

    lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数。现在lxhgww想要知道满足要求的字符串共有多少个,聪明的程序员们,你们能帮助他吗?

    Input

    输入数据是一行,包括2个数字n和m

    Output

    输出数据是一行,包括1个数字,表示满足要求的字符串数目,这个数可能会很大,只需输出这个数除以20100403的余数

     

     

    对于100%的数据,保证1<=m<=n<=1000000


    又是裸题,Catalan数变式...

    结果我这个傻逼没预处理逆元阶乘T了一次

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    typedef long long ll;
    const int N=2e6+5,MOD=20100403;
    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,m;
    int inv[N],fac[N],facInv[N];
    void ini(int n){
        inv[1]=1;fac[0]=facInv[0]=1;
        for(int i=1;i<=n;i++){
            if(i!=1) inv[i]=(ll)-MOD/i*inv[MOD%i]%MOD;
            inv[i]+=inv[i]<0?MOD:0;
            fac[i]=(ll)fac[i-1]*i%MOD;
            facInv[i]=(ll)facInv[i-1]*inv[i]%MOD;
        }
    }
    inline int C(int n,int m){
        return (ll)fac[n]*facInv[m]%MOD*facInv[n-m]%MOD;
    }
    int main(){
        freopen("in","r",stdin);
        n=read();m=read();
        ini(n+m);
        printf("%d",(C(n+m,n)-C(n+m,n+1)+MOD)%MOD);
    }
  • 相关阅读:
    Linux Core Dump
    ODP.NET Managed正式推出
    获取EditText的光标位置
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1028 数的计算
  • 原文地址:https://www.cnblogs.com/candy99/p/6406710.html
Copyright © 2011-2022 走看看