1 条题解

  • 0
    @ 2026-7-4 12:03:20

    #include <cstdio>
    const int M = 21;
    int read()
    {
    	int x=0,f=1;char c;
    	while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;}
    	while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();}
    	return x*f;
    }
    int n,m,f[1<<M][M];char s[1<<M];
    signed main()
    {
    	n=read();m=read();
    	for(int i=0;i<=n;i++)
    	{
    		scanf("%s",s);
    		for(int j=0;j<(1<<i);j++)
    			f[(1<<i)|j][i]=(s[j]=='1');
    	}
    	for(int i=n;i>=1;i--) for(int j=0;j<(1<<i);j++)
    		for(int k=i;k>0;k--) if(f[(1<<i)|j][k])
    		{
    			int t=f[(1<<i)|j][k],S=j>>k,T=j&((1<<k)-1);
    			f[(1<<i-k)|S][0]+=t;
    			if(T)//add 1
    			{
    				int u=k-1;
    				while(!(T>>u&1)) u--;
    				f[(1<<i-k+u+1)|(S<<u+1)|(1<<u)
    				|(T&((1<<u)-1))][u]+=t;
    			}
    			if((~T)&((1<<k)-1))
    			{
    				int u=k-1;
    				while(T>>u&1) u--;
    				f[(1<<i-k+u+1)|(S<<u+1)
    				|(T&((1<<u)-1))][u]+=t;
    			}
    		}
    	for(int i=n;i>=0;i--)
    		for(int j=0;j<(1<<i);j++) if(f[(1<<i)|j][0]>=m)
    		{
    			for(int k=i-1;k>=0;k--)
    				printf("%d",j>>k&1);
    			puts("");
    			return 0;
    		}
    }
    
    
    • 1

    信息

    ID
    8668
    时间
    2000ms
    内存
    1024MiB
    难度
    10
    标签
    递交数
    3
    已通过
    1
    上传者