1 条题解

  • 0
    @ 2025-9-10 9:15:12

    C :

    #include "stdio.h"
    int n,l,m;
    int a[32];
    int C(int n,int a)
    {
    	int i,j;
    	long long s;
    	if(a<n-a)
    		a=n-a;
    	s=1,j=2;
    	for(i=a+1;i<=n;i++)
    	{
    		s*=i;
    		while(j<=n-a&&s%j==0)
    		{
    			s/=j;
    			j++;
    		}
    	}
    	return s;
    }
    int F(int d)
    {
    	int i,s;
    	s=0;
    	for(i=0;i<=l&&i<d;i++)
    		s+=C(d-1,i);
    
    	return s;
    }
    void print()
    {
    	int i;
    	for(i=n-1;i>=0;i--)
    		printf("%d",a[i]);
    	printf("\n");
    }
    int main()
    {
    	int i,t;
    	scanf("%d%d%d",&n,&l,&m);
    	for(i=n;i>=1;i--)
    	{
    		if(m==1||m==2)
    		{
    			a[0]=m-1;
    			break;
    		}
    		t=F(i);
    		if(t<m)
    		{
    			a[i-1]=1;
    			l--;
    			m-=t;
    		}
    	}
    	print();
    	return 0;
    }
    

    C++ :

    #include<cstdio>
    using namespace std;
    int f(int aa,int bb)
    {
    	int ll=1;
    	while(bb)
    	{
    		if(bb&1)
    		ll=ll*aa;
    		aa=aa*aa;
    		bb>>=1;
    	}
    	return ll;
    }
    int main()
    {
    	int N,L,i,j,k,ss;
    	scanf("%d %d %d",&N,&L,&i);
    	ss=f(2,L+1)-1;
    	if(i<=ss)
    	{
    		int q=i-1,c[35]={0},qq=N;
    		while(q)
    		{
    			c[qq-1]=q%2;
    			q/=2;
    			qq--;
    		}
    		for(k=0;k<N;k++)
    		printf("%d",c[k]);
    		return 0;
    	}
    	for(j=ss+1;;j++)
    	{
    		
    		int t=j,a[35]={0},h=N,count=0;
    		while(t)
    		{
    			a[h-1]=t%2;
    			t/=2;
    			h--;
    		}
    		for(k=0;k<N;k++)
    		{
    			if(a[k]==1)
    			count++;
    		}
    		if(count>L)
    		continue;
    		else 
    		{
    			ss++;
    			if(ss==i)
    			{
    				for(k=0;k<N;k++)
    				printf("%d",a[k]);
    				return 0;
    			}
    		}
    	}
    }
    

    Pascal :

    program kimbits;
    var pos:array[0..35] of longint;
        f:array[0..35,0..35] of longint;
        i,j,l,n,k:longint;
    function min(a,b:longint):longint;
    begin
     if a<b then exit(a)
      else exit(b);
    end;
    
    procedure comeout(a,b,c:longint);
    var tip:longint;
    begin
     if a=0 then exit;
     tip:=f[a-1,b];
     if tip<c then
      begin
       write('1');
       comeout(a-1,b-1,c-tip);
      end
     else
      begin
       write('0');
       comeout(a-1,b,c);
      end;
    end;
    
    begin
    readln(n,l,i);
    for k:=0 to n do
     f[k,0]:=1;
    for k:=0 to l do
     f[0,k]:=1;
    for k:=1 to n do
     for j:=1 to l do
      f[k,j]:=f[k-1,j]+f[k-1,j-1];
    comeout(n,l,i);
    end.
    
    
    • 1

    信息

    ID
    4477
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者