2 条题解

  • 0
    @ 2025-10-8 16:53:07
    #include<bits/stdc++.h>
    using namespace std;
    const int mod=1e9;
    struct node
    {
        int len,a[23];
        node(){memset(a,0,sizeof(a));len=1;}
    };
    node operator+ (node n1,node n2)
    {
        node no;no.len=max(n1.len,n2.len);
        for(int i=1;i<=no.len;i++)no.a[i]=n1.a[i]+n2.a[i];
        for(int i=1;i<=no.len;i++)no.a[i+1]+=no.a[i]/mod,no.a[i]%=mod;
        int i=no.len;
        while(no.a[i+1]>0)
        {
            i++,no.a[i+1]+=no.a[i]/mod,no.a[i]%=mod;
        }
        no.len=i;
        return no;
    }
    node f[512][512];//f[i][j]表示从1-j里面选i个
    void putnum(int x)
    {
        int t=mod/10;
        while(x<t) printf("0"),t/=10;
        if(x>0) printf("%d",x); 
    }
    int main()
    {
        int k,w;scanf("%d%d",&k,&w);
        int n=(w+k-1)/k;//位数
        int mk=(1<<k)-1;
        if(n>mk) n=mk;
        for(int i=1;i<=mk;i++)f[1][i].a[1]=i;
        for(int i=2;i<=n;i++)
        {
            for(int j=i;j<=mk;j++)
                f[i][j]=f[i-1][j-1]+f[i][j-1];
        }
        node ans;
        int ww=w%k;if(ww==0)ww=k;
        int st=(1<<ww)-1;
        for(int j=1;j<=st;j++) ans=ans+f[n-1][mk-j];
        for(int i=n-1;i>=2;i--)ans=ans+f[i][mk];
        printf("%d",ans.a[ans.len]);
        for(int i=ans.len-1;i>=1;i--)putnum(ans.a[i]);
        return 0; 
    }
    
    #include<bits/stdc++.h>//暴力O(n^3)
    using namespace std;
    const int mod=1e9;
    struct node
    {
        int len,a[23];
        node(){memset(a,0,sizeof(a));len=1;}
    };
    node operator+ (node n1,node n2)
    {
        node no;no.len=max(n1.len,n2.len);
        for(int i=1;i<=no.len;i++)no.a[i]=n1.a[i]+n2.a[i];
        for(int i=1;i<=no.len;i++)no.a[i+1]+=no.a[i]/mod,no.a[i]%=mod;
        int i=no.len;
        while(no.a[i+1]>0)
        {
            i++,no.a[i+1]+=no.a[i]/mod,no.a[i]%=mod;
        }
        no.len=i;
        return no;
    }
    node f[1100][512];
    void putnum(int x)
    {
        int t=mod/10;
        while(x<t) printf("0"),t/=10;
        if(x>0) printf("%d",x); 
    }
    int main()
    {
        int k,w;scanf("%d%d",&k,&w);
        int n=(w+k-1)/k;//位数
        int mk=(1<<k)-1;
        for(int j=0;j<=mk;j++)f[1][j].a[1]=1;
        for(int i=2;i<=n;i++)
        {
            for(int j=1;j<=mk;j++)
                for(int jj=j+1;jj<=mk;jj++)
                    f[i][j]=f[i][j]+f[i-1][jj];
        }
        node ans;
        int ww=w%k;if(ww==0)ww=k;
        int st=(1<<ww)-1;
        for(int j=1;j<=st;j++) ans=ans+f[n][j];
        for(int i=n-1;i>=2;i--)
            for(int j=1;j<=mk;j++)
                ans=ans+f[i][j];
        printf("%d",ans.a[ans.len]);
        for(int i=ans.len-1;i>=1;i--)putnum(ans.a[i]);
        return 0; 
    }
    
    • 0
      @ 2025-10-8 16:52:49

      #include<bits/stdc++.h>
      using namespace std;
      const int mod=1e9;
      struct node
      {
      	int len,a[23];
      	node(){memset(a,0,sizeof(a));len=1;}
      };
      node operator+ (node n1,node n2)
      {
      	node no;no.len=max(n1.len,n2.len);
      	for(int i=1;i<=no.len;i++)no.a[i]=n1.a[i]+n2.a[i];
      	for(int i=1;i<=no.len;i++)no.a[i+1]+=no.a[i]/mod,no.a[i]%=mod;
      	int i=no.len;
      	while(no.a[i+1]>0)
      	{
      		i++,no.a[i+1]+=no.a[i]/mod,no.a[i]%=mod;
      	}
      	no.len=i;
      	return no;
      }
      node f[512][512];//f[i][j]表示从1-j里面选i个
      void putnum(int x)
      {
      	int t=mod/10;
      	while(x<t) printf("0"),t/=10;
      	if(x>0) printf("%d",x); 
      }
      int main()
      {
      	int k,w;scanf("%d%d",&k,&w);
      	int n=(w+k-1)/k;//位数
      	int mk=(1<<k)-1;
      	if(n>mk) n=mk;
      	for(int i=1;i<=mk;i++)f[1][i].a[1]=i;
      	for(int i=2;i<=n;i++)
      	{
      		for(int j=i;j<=mk;j++)
      			f[i][j]=f[i-1][j-1]+f[i][j-1];
      	}
      	node ans;
      	int ww=w%k;if(ww==0)ww=k;
      	int st=(1<<ww)-1;
      	for(int j=1;j<=st;j++) ans=ans+f[n-1][mk-j];
      	for(int i=n-1;i>=2;i--)ans=ans+f[i][mk];
      	printf("%d",ans.a[ans.len]);
      	for(int i=ans.len-1;i>=1;i--)putnum(ans.a[i]);
      	return 0; 
      }




      #include<bits/stdc++.h>//暴力O(n^3)
      using namespace std;
      const int mod=1e9;
      struct node
      {
      	int len,a[23];
      	node(){memset(a,0,sizeof(a));len=1;}
      };
      node operator+ (node n1,node n2)
      {
      	node no;no.len=max(n1.len,n2.len);
      	for(int i=1;i<=no.len;i++)no.a[i]=n1.a[i]+n2.a[i];
      	for(int i=1;i<=no.len;i++)no.a[i+1]+=no.a[i]/mod,no.a[i]%=mod;
      	int i=no.len;
      	while(no.a[i+1]>0)
      	{
      		i++,no.a[i+1]+=no.a[i]/mod,no.a[i]%=mod;
      	}
      	no.len=i;
      	return no;
      }
      node f[1100][512];
      void putnum(int x)
      {
      	int t=mod/10;
      	while(x<t) printf("0"),t/=10;
      	if(x>0) printf("%d",x); 
      }
      int main()
      {
      	int k,w;scanf("%d%d",&k,&w);
      	int n=(w+k-1)/k;//位数
      	int mk=(1<<k)-1;
      	for(int j=0;j<=mk;j++)f[1][j].a[1]=1;
      	for(int i=2;i<=n;i++)
      	{
      		for(int j=1;j<=mk;j++)
      			for(int jj=j+1;jj<=mk;jj++)
      				f[i][j]=f[i][j]+f[i-1][jj];
      	}
      	node ans;
      	int ww=w%k;if(ww==0)ww=k;
      	int st=(1<<ww)-1;
      	for(int j=1;j<=st;j++) ans=ans+f[n][j];
      	for(int i=n-1;i>=2;i--)
      		for(int j=1;j<=mk;j++)
      			ans=ans+f[i][j];
      	printf("%d",ans.a[ans.len]);
      	for(int i=ans.len-1;i>=1;i--)putnum(ans.a[i]);
      	return 0; 
      }





      • 1

      *【组合数】[NOIP 2006 提高组] 2^k进制数

      信息

      ID
      31
      时间
      1000ms
      内存
      128MiB
      难度
      6
      标签
      递交数
      50
      已通过
      16
      上传者