ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【NOIP2012模拟8.7】奶牛编号

2020-08-12 08:00:43  阅读:232  来源: 互联网

标签:return NOIP2012 8.7 int dg len 枚举 奶牛 我们


Description

在这里插入图片描述

Input

在这里插入图片描述

Output

在这里插入图片描述

Solution

对于这道题,我们先设0放x个,1放k个k个
设当前剩下x'个0和k'个1,则对于剩下的位置,我们可以把它抽象成将x'个0插入到x'+k'个位置中,方案数为\(C_{x'+k'-1}^{x'}\)
因此我们可以先枚举放置的0的个数,当总方案数\(\geqslant\)n时,那么我们要求的答案长度便求了出来
于是我们可以暴力枚举了
即使我们知道了答案的长度,暴力枚举仍然不在考虑范围内,因为它还是会炸
而上文提到的组合数又派上了用场
我们用组合数计算出当前这个位置放0的方案数,若其小于当前要求的n,则说明我们要求的答案在该位一定放1,否则一定放0。这样我们就可以一路递推下去,以O(len)的时间算出答案。

友情提示:作者组合数使用了二维,理论极限数据过不去,但数据过水再加点小优化就卡过去了,正解好像要用一维的来着。

Code

#include <cstdio>
using namespace std;
int n,k,len,x,i,j,f[3000001],c[3001][3001];
long long p,num;
int C(int x,int y)
{
    if (y==0 || x==y) return 1;
    if (y==1 || y==x-1) return x;
    return c[x][y]; 
}
void dg(int x,int y,int z)
{
    int g;
    if (x>len)
    {
       for (int i=1;i<=len;i++)
            printf("%d",f[i]);
        return;
    }
    if (x==1) 
    {
        f[1]=1;
        dg(x+1,y,z);
    }else
    {
        if (z==len-x+1)
        {
            dg(len+1,y,z);
            return;
        }
        g=C(len-x,z-1);
        if (g>=y) 
        {
            f[x]=0;
            dg(x+1,y,z-1);
        }else
        {
            f[x]=1;
            dg(x+1,y-g,z);
        }
    }
}
int main()
{
    freopen("number.in","r",stdin);
    freopen("number.out","w",stdout);
    scanf("%d%d",&n,&k);
    if (k==1)
    {
        printf("1");
        for (i=1;i<n;i++)
            printf("0");
        return 0;
    }
    c[1][1]=c[1][0]=1;
    for (i=2;i<=3000;i++)
    {
        c[i][0]=1;
        for (j=1;j<=i;j++)
            c[i][j]=c[i-1][j-1]+c[i-1][j];
    }
    for (i=0;i<=n;i++)
        if (c[k+i-1][i]+p>=n)
        {
            len=k+i;
            break;
        }else p+=c[k+i-1][i];
    n-=p;
    dg(1,n,len-k);
}

标签:return,NOIP2012,8.7,int,dg,len,枚举,奶牛,我们
来源: https://www.cnblogs.com/Sport-river/p/13488525.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有