1 solutions

  • 0
    @ 2024-12-10 23:55:33

    C++ :

    #include <iostream>
    #include <cstdio>
    
    using namespace std;
    
    struct bign
    {
    	int len,num[21];
    };
    
    bign bign_init(int a)
    {
    	bign temp={0};
    	while(a)
    	{
    		temp.num[temp.len++]=a%10000;
    		a/=10000;
    	}
    	return temp;
    }
    
    void bign_print(bign a)
    {
    	if(a.len==0)
    	{
    		printf("0");
    		return;
    	}
    	
    	printf("%d",a.num[a.len-1]);
    	
    	for(int i=a.len-2;i>=0;i--)
    	{
    		printf("%04d",a.num[i]);
    	}
    }
    
    bign bign_plus(bign a,bign b)
    {
    	if(a.len<b.len) a.len=b.len;
    
    	for(int i=0;i<a.len;i++)
    	{
    		a.num[i]+=b.num[i];
    	}
    
    	for(int i=0;i<a.len;i++)
    	{
    		if (a.num[i]>10000)
    		{
    			a.num[i+1]++;
    			a.num[i]-=10000;
    		}
    	}
    
    	if(a.num[a.len]!=0) a.len++;
    
    	return a;
    }
    
    int k,w,s,r;
    bign ans={0};
    bign f[1001][1<<9];
    
    int main()
    {
    	scanf("%d%d",&k,&w);
    
    	s=(w-1)/k+1;
    
    	for(int i=0;i<=(1<<k)-1;i++)
    	{
    		f[s][i]=bign_init(1);
    	}
    
    	for(int i=s-1;i>=2;i--)
    	{
    		for(int j=1;j<=(1<<k)-(s+1-i);j++)
    		{
    			for(int l=j+1;l<=(1<<k)-(s-i);l++)
    			{
    				f[i][j]=bign_plus(f[i][j],f[i+1][l]);
    			}
    	
    			if(!(i==s-1&&j==0))
    			{
    				ans=bign_plus(ans,f[i][j]);
    			}
    		}
    	}
    
    	r=(w-1)%k+1;
    
    	for(int i=1;i<=(1<<r)-1;i++)
    	{
    		for(int j=i+1;j<=(1<<k)-(s-1);j++)
    		{
    			f[1][i]=bign_plus(f[1][i],f[2][j]);
    		}
    		
    		ans=bign_plus(ans,f[1][i]);
    	}
    
    	bign_print(ans);
    
    	return 0;
    }
    
    
    • 1

    Information

    ID
    654
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By