您的位置:首页 > 其它

bzoj 1005: [HNOI2008]明明的烦恼

2016-02-27 22:29 274 查看
#include<cstdio>
#include<iostream>
#define M 10005
int a[M],n,d[M],f[M],b[M],tot,m;
void jia(int a1)
{
for(int i=1;i<=d[0];i++)
for(;a1%d[i]==0;)
{
b[i]++;
a1/=d[i];
}
return;
}
void jian(int a1)
{
for(int i=1;i<=d[0];i++)
for(;a1%d[i]==0;)
{
b[i]--;
a1/=d[i];
}
return;
}
void cheng(int a1)
{
for(int i=1;i<=a[0];i++)
a[i]*=d[a1];
for(int i=1;i<=a[0];i++)
{
a[i+1]+=a[i]/10;
a[i]%=10;
}
for(;a[a[0]+1];)
{
a[0]++;
a[a[0]+1]=a[a[0]]/10;
a[a[0]]%=10;
}
}
int main()
{
scanf("%d",&n);
for(int i=2;i<=n;i++)
if(!f[i])
for(int j=2*i;j<=n;j+=i)
f[j]=1;
for(int i=2;i<=n;i++)
if(!f[i])
{
d[0]++;
d[d[0]]=i;
}
for(int i=2;i<=n-2;i++)
jia(i);
for(int i=1;i<=n;i++)
{
int a1;
scanf("%d",&a1);
if(a1==-1)
m++;
else
{
for(int j=1;j<a1;j++)
jian(j);
tot+=a1-1;
}
}
for(int i=1;i<=n-2-tot;i++)
{
jia(m);
jian(i);
}
a[0]=1;
a[1]=1;
for(int i=1;i<=d[0];i++)
for(;b[i]>0;b[i]--)
cheng(i);
for(int i=a[0];i;i--)
printf("%d",a[i]);
return 0;
}


该题运用到了树的prufer编码,然后一个复杂的数学式子化简。http://www.cnblogs.com/noip/archive/2013/03/10/2952520.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: