zoukankan      html  css  js  c++  java
  • bzoj 1856

    做这题之前先看道高考真题(好像是真题,我记不清了)

    例:已知一个由n个0和n个1排列而成的数列,要求对于任意k∈N*且k∈[1,2n],在前k个数中1的个数不少于0的个数,求当n=4时这样的数列的数量。

    解:14个(策略:暴力枚举,时间复杂度O(2^n))

    所以本题其实就是对高考真题的一个一般化推广,首先扩大了n的范围,而且0的个数和1的个数可能不等了,所以这道题并不简单

    我们通过打表可以发现:当n=m时,答案满足卡特兰数列,即C_{2n}^{n}-C_{2n}^{n-1}

    当n!=m呢?

    再稍微打个表,答案就是C_{n+m}^{n}-C_{n+m}^{n+1}

    (我不会告诉你我没打出来这个表的)

    接下来就好说了,预处理阶乘逆元然后计算组合数即可

    但是为什么是这个公式呢?

    我们稍微转化一下:将问题放到坐标系上,假设1代表向右上走,0代表向右下走,那么问题转化为了从(0,0)点到(n+m,n-m)点且不经过第四象限的方案数

    那么如果完全统计方案数,答案即为C_{n+m}^{n}

    但是一定有一些是不合法的啊

    那么如果是不合法的方案,这些不合法的路径一定会经过直线y=-1,那么我们将经过这条直线之前的所有点关于这条直线对称,会发现起点变成了(0,-2)!

    于是问题转化为了从(0,-2)走到(n+m,n-m)的方案数

    设向上走x步,向下走y步

    则x+y=n+m,x-y=n-m+2

    ∴x=n+1,y=m-1

    ∴方案数即为C^{_{n+m}^{n+1}}

    两者做差即可

    解释如图。

    当然,这题还有一些递推式,比如f[i][j]=f[i-1][j]+f[i][j-1],若i<j f[i][j]=0

    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <cstdlib>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <stack>
    #define ll long long
    #define mode 20100403
    using namespace std;
    ll inv[2000005];
    ll mul[2000005];
    ll n,m;
    void init()
    {
        inv[1]=inv[0]=1;
        for(int i=2;i<=n+m;i++)
        {
            inv[i]=(mode-mode/i)*inv[mode%i]%mode;
        }
        mul[0]=mul[1]=1;
        for(int i=2;i<=n+m;i++)
        {
            inv[i]*=inv[i-1];
            inv[i]%=mode;
            mul[i]=mul[i-1]*i%mode;
        }
    }
    ll C(ll x,ll y)
    {
        if(y>x)
        {
            return 0;
        }
        return mul[x]*inv[y]%mode*inv[x-y]%mode;
    }
    int main()
    {
    //    freopen("task.in","r",stdin);
    //    freopen("task.out","w",stdout);
        scanf("%lld%lld",&n,&m);
        init();
        printf("%lld
    ",((C(n+m,n)-C(n+m,n+1))%mode+mode)%mode);
        return 0;
    }
  • 相关阅读:
    基于C++CJAVA的python入门
    雁栖湖健身计划
    显存的一些知识
    Cuda_bank-conflict
    翻译文章进展
    一些CV界的好资源
    how processor caches work
    LINQ-进阶的扩展方法
    LINQ-基础
    CTFHUB-技能树 基础知识 ctf练习平台
  • 原文地址:https://www.cnblogs.com/zhangleo/p/9756488.html
Copyright © 2011-2022 走看看