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);
    }
  • 相关阅读:
    关于点击率模型,你知道这三点就够了
    【AI】Computing Machinery and Intelligence
    MATLAB 的函数句柄
    MATLAB 的unique函数——数组矩阵的唯一值
    MATLAB 的数据导入与导出
    MATLAB 的函数
    MATLAB 向量
    MATLAB 的break语句和continue语句
    MATLAB 的循环语句
    MATLAB 的条件分支语句
  • 原文地址:https://www.cnblogs.com/candy99/p/6406710.html
Copyright © 2011-2022 走看看