记录编号 |
33586 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[金陵中学2007] 最优分解方案 |
最终得分 |
100 |
用户昵称 |
Truth.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);
}