记录编号 33586 评测结果 AAAAAAAAAA
题目名称 [金陵中学2007] 最优分解方案 最终得分 100
用户昵称 GravatarTruth.Cirno 是否通过 通过
代码语言 C++ 运行时间 0.296 s
提交时间 2011-11-11 14:04:35 内存使用 1.38 MiB
显示代码纯文本
#include <cstdio>
using namespace std;

struct bint
{
	int len,num[20];
};

struct boo
{
	bool b[1001];
};

boo used[1001]={false};
bint f[1001]={0},changed[1001]={0};
//bint maxnum={0};

bool bcmp(bint a,bint b)
{
	if (a.len>b.len)
		return(0);
	else if (a.len<b.len)
		return(1);
	int i;
	for (i=a.len-1;i>=0;i--)
		if (a.num[i]>b.num[i])
			return(0);
		else if (a.num[i]<b.num[i])
			return(1);
	return(0);
}

bint bchange(int a)
{
	bint temp={0};
	while (a)
	{
		temp.num[temp.len++]=a%10000;
		a/=10000;
	}
	return(temp);
}

bint btim(bint a,bint b)
{
	bint temp={0};
	int i,j;
	temp.len=a.len+b.len-1;
	for (i=0;i<a.len;i++)
		for (j=0;j<b.len;j++)
			temp.num[i+j]+=a.num[i]*b.num[j];
	for (i=0;i<temp.len;i++)
		if (temp.num[i]>10000)
		{
			temp.num[i+1]+=temp.num[i]/10000;
			temp.num[i]%=10000;
		}
	if (temp.num[temp.len]!=0)
		temp.len++;
	return(temp);
}

void bprint(bint a)
{
	if (a.len==0)
	{
		printf("0");
		return;
	}
	int i;
	printf("%d",a.num[a.len-1]);
	for (i=a.len-2;i>=0;i--)
		printf("%04d",a.num[i]);
}
/*
void tryit(int num,int rest,bint mul)
{
	int i;
	if (rest==0)
	{
		if (bcmp(mul,maxnum)==0)
			maxnum=mul;
		return;
	}
	for (i=num+1;i<=(rest>>1);i++)
	{
		if (!used[i])
		{
			used[i]=true;
			tryit(i,rest-i,btim(mul,bchange(i)));
			used[i]=false;
		}
	}
	if (!used[rest])
		tryit(rest,0,btim(mul,bchange(rest)));
}
*/
int main(void)
{
	freopen("best.in","r",stdin);
	freopen("best.out","w",stdout);
	int i,j,n,tempj,tempnum;
	bint temp;
	scanf("%d\n",&n);
//	for (i=1;i<=(n>>1);i++)
//	{
//		used[i]=true;
//		tryit(i,n-i,bchange(i));
//		used[i]=false;
//		tryit(n,0,bchange(n));
//	}
	for (i=0;i<=n;i++)
		changed[i]=bchange(i);
	f[0]=bchange(1);
	for (i=1;i<=n;i++)
	{
		for (j=i-1;j>=0;j--)
		{
			tempnum=i-j;
			if (!used[j].b[tempnum])
			{
				temp=btim(f[j],changed[tempnum]);
				if (bcmp(temp,f[i])==0)
				{
					f[i]=temp;
					tempj=j;
				}
			}
		}
//		for (j=1;j<=i;j++)
//			used[i][j]=used[tempj][j];
		used[i]=used[tempj];
		used[i].b[i-tempj]=true;
	}
//	bprint(maxnum);
	bprint(f[n]);
	printf("\n");
	fclose(stdin);
	fclose(stdout);
	return(0);
}