比赛 20111111 评测结果 AAAAAAAAAA
题目名称 最优分解方案 最终得分 100
用户昵称 Czb。 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-11-11 10:15:36
显示代码纯文本
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define max(a,b) a>b?a:b
#define BASE 10000

FILE *fi=fopen("best.in","r");
FILE *fo=fopen("best.out","w");

struct Num
{
	int len;
	int num[50];
	Num()
	{
		len=0;
		for(int i=0;i<50;i++)
			num[i]=0;
	}
};

struct aaa
{
	bool b[1001];
}f[1001];

Num mul(Num a,Num b)
{
	int i,j;
	Num c;
 	for(i=1;i<=a.len;i++)
	{
		for(j=1;j<=b.len;j++)
		{
			c.num[i+j-1]+=a.num[i]*b.num[j];
			if(c.num[i+j-1]>=BASE)
			{
				c.num[i+j]+=c.num[i+j-1]/BASE;
				c.num[i+j-1]%=BASE; 
			}
		}
	}
	c.len=a.len+b.len-1;
	while(c.num[c.len+1]>0)
		c.len++; 
	return c;
}

bool cmp(Num a,Num b)
{
	int i;
	if(a.len>b.len)
	{
		return true;
	}
	else if(a.len<b.len)
	{
		return false;
	}
	else
	{
		for(i=a.len;i>0;i--)
		{
			if(a.num[i]>b.num[i])
			{
				return true;
			}
			else if(a.num[i]<b.num[i])
			{
				return false;
			}
		}
	}
	return false;
}

void output(Num a)
{
	int i;
	fprintf(fo,"%d",a.num[a.len]);
	for(i=a.len-1;i>0;i--)
	{
		fprintf(fo,"%04d",a.num[i]);
	}
	fprintf(fo,"\n");
}

int n;

Num a[1001],x,y;

int main()
{
	int i,j;
	fscanf(fi,"%d",&n);
	a[0].len=1;
	a[0].num[1]=1;
	for(i=1;i<=n;i++)
	{
		for(j=0;j<i;j++)
		{
			if(!f[j].b[i-j])
			{
				y.len=1;
				y.num[1]=i-j;
				x=mul(a[j],y);
				if(cmp(x,a[i]))
				{
					a[i]=x;
					f[i]=f[j];
					f[i].b[i-j]=true;
				}
			}
		}
	}
	output(a[n]);
	fclose(fi);
	fclose(fo);
	return 0;
}