记录编号 167820 评测结果 AAAAAAAAAA
题目名称 [NOIP 2006]2^k进制数 最终得分 100
用户昵称 Gravatarmikumikumi 是否通过 通过
代码语言 C++ 运行时间 0.667 s
提交时间 2015-06-28 21:51:14 内存使用 0.35 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int k,w,mod=100000;
class miku
{
    public:
	int n;
	int s[20];
	miku(){n=1;memset(s,0,sizeof(s));}
	void operator = (int a)
	{
		memset(s,0,sizeof(s));
		n=1;
		s[0]=a;
	}
	void operator += (const miku &b)
	{
		n=max(n,b.n)+1;
		for(int i=0;i<n;i++)
		{
			s[i]+=b.s[i];
			s[i+1]+=s[i]/mod;
			s[i]%=mod;
		}
		while(n>1&&s[n-1]==0) n--;
	}
	void print()
	{
		printf("%d",s[n-1]);
		for(int i=n-2;i>=0;i--)
			printf("%05d",s[i]);
	}
	void clear()
	{
		n=1;memset(s,0,sizeof(s));
	}
};
miku F[2][520];
miku ans;
int main()
{
	freopen("digital.in","r",stdin);
	freopen("digital.out","w",stdout);
	scanf("%d%d",&k,&w);
	int n=w/k+1;
	int m=1<<k;
	for(int i=1;i<=m;i++)
		F[1][i]=1;
	int now;
	for(int i=2;i<=n;i++)
	{
		if(i==n) now=1<<(w%k);
		else now=m;
		for(int j=1;j<now;j++)
		{
			F[i&1][j].clear();
			for(int k=j+1;k<m;k++)
			{
				F[i&1][j]+=F[(i-1)&1][k];
		    }
			ans+=F[i&1][j];
		}
	}
	ans.print();
	return 0;
}