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