• 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;
    }
  • 相关阅读:
    HDU 3436 Queuejumpers
    POJ 3580 SuperMemo
    HDU 2871 Memory Control
    Android 实现显示文字的Gallery
    Android 使用地图
    Android 深入的研究一下蓝牙
    手机录制视频demo
    用android来实现图片的绘制以及旋转缩放案例分析
    TextView 自动滚动(跑马灯)
    Android腾讯微博客户端开发一:在下方的Tab的实现
  • 原文地址:https://www.cnblogs.com/zhangleo/p/9756488.html
Copyright © 2020-2023  润新知