记录编号 107205 评测结果 AAAAAAAAAA
题目名称 [NOIP 2006]2^k进制数 最终得分 100
用户昵称 Gravatar天一阁 是否通过 通过
代码语言 C++ 运行时间 0.334 s
提交时间 2014-06-23 12:20:40 内存使用 43.33 MiB
显示代码纯文本
#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()
{
	freopen("digital.in","r",stdin);
	freopen("digital.out","w",stdout);

	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;
}