• 牡牛和牝牛


    牡牛和牝牛

    有n个0或者1,进行全排列,要求任意两个0间至少有k个1,询问其方案数%5000011。
    对于全部数据,对于全部数据,(1≤N≤10^5,0≤K<N)

    解:

    显然为排列组合问题,考虑方向自然为通项与递推方程。

    法一(通项公式):

    首先0决定了1的摆放,其次数据范围支持对0的枚举,于是枚举0的个数,设其x,于是每个间隔至少要有k个1,不妨先构造让其满足条件,需要(x-1)k个1,显然有((x-1)k+xleq nRightarrow [frac{n+k}{k+1}]),于是问题即变成对于剩下的1的插入0之间的间隔,
    共有x+1个间隔,剩下的1的个数为(n-(x-1)k-x)

    思路一:

    间隔是有序的,而1是无序的,不好解决无序的元素放入有序的盒子的方案数的问题,反过来看则是有序的间隔放入无序的1,而间隔可以多次放入同一个1,即可重组合,于是方案数不难得知为(C_{n-(x-1)k}^{x})


    思路二:

    插入组合问题很困难,于是考虑组合转排列,转换模型,即等价于(n-(x-1)k-x)个1与(x)个0进行全排列,根据可重排列公式有:

    [frac{(n-(x-1)k-x+x)!}{x!(n-(x-1)k-x)!}=frac{(n-(x-1)k)!}{x!(n-(x-1)k-x)!} ]

    [=C_{n-(x-1)k}^{x} ]


    所以只要枚举0的个数,代入公式累加即可。

    参考代码:
    #include <iostream>
    #include <cstdio>
    #define il inline
    #define ri register
    #define ll long long
    #define yyb 5000011
    using namespace std;
    ll jc[100001],jv[100001],lsy(1);
    il ll pow(ll,ll),c(int,int);
    int main(){
        int n,i,j,k,li;scanf("%d%d",&n,&k);
        for(i=jc[0]=1;i<=n;++i)jc[i]=jc[i-1]*i%yyb;
        jv[n]=pow(jc[n],yyb-2),li=(n+k)/(k+1);
        for(i=n,jv[0]=1;i>1;--i)jv[i-1]=jv[i]*i%yyb;
        for(i=1;i<=li;++i)(lsy+=c(n-(i-1)*k,i))%=yyb;
        printf("%lld",lsy);
        return 0;
    }
    il ll c(int n,int r){
        if(n<r)return 0;
        return jc[n]*jv[r]%yyb*jv[n-r]%yyb;
    }
    il ll pow(ll x,ll y){
        ll ans(1);
        while(y){
            if(y&1)ans=ans*x%yyb;
            x=x*x%yyb,y>>=1;
        }return ans;
    }
    

    法二(递推方程)

    经验告诉我们以序列长度为状态,于是设(f[i])表示填到第i个位置的方案数,显然策略为填0或者1,填1恒满足累加(f[i-1]),填0导致前k个都不能填0,故累加(f[i-k-1]),于是有:

    [f[i]=f[i-1]+f[i-k-1] ]

    参考代码:
    #include <iostream>
    #include <cstdio>
    #define il inline
    #define ri register
    #define yyb 5000011
    using namespace std;
    int dp[100001];
    int main(){
        int n,k,i;
        scanf("%d%d",&n,&k);
        for(i=1;i<=k+1;++i)dp[i]=i+1;
        for(i=k+2;i<=n;++i)
            dp[i]=(dp[i-k-1]+dp[i-1])%yyb;
        printf("%d",dp[n]);
        return 0;
    }
    
    
  • 相关阅读:
    重新认识布局:html和body元素
    重新认识布局:3d空间中的css盒子
    重新认识布局:百分比单位
    重新认识布局:标准流,浮动,定位的关系
    Redis(1.7)Redis高可用架构与数据库交互(理论篇)
    C++: 模块定义文件声明(.def)的使用
    HttpListener supports SSL only for localhost? install certificate
    跨域请求引起的 OPTIONS request
    html 浏览器自动加上 标签的详解
    c# HttpServer 的使用
  • 原文地址:https://www.cnblogs.com/a1b3c7d9/p/10780306.html
Copyright © 2020-2023  润新知