您的位置:首页 > 其它

bzoj 1005: [HNOI2008]明明的烦恼

2014-01-05 19:11 246 查看
prufer编码的应用:

var
a:array[1..10000]of longint;
su,p:array[1..1000]of longint;
b:array[1..10000]of boolean;
ans:array[1..10000]of longint;
i,j,m,n,s,k,w,sum,c:longint;
procedure add(t,d:longint);
var
i:longint;
begin
for i:=1 to s do
while t mod su[i]=0 do
begin
inc(p[i],d);
t:=t div su[i];
end;
end;
procedure cheng(t:longint);
var
i:longint;
begin
for i:=1 to c do
ans[i]:=ans[i]*t;
for i:=1 to c-1 do
begin
inc(ans[i+1],ans[i] div 10);
ans[i]:=ans[i] mod 10;
end;
while ans[c]>=10 do
begin
ans[c+1]:=ans[c] div 10;
ans[c]:=ans[c] mod 10;
inc(c);
end;
end;
begin
readln(n);
for i:=1 to n do
read(a[i]);
fillchar(b,sizeof(b),true);
for i:=2 to n do
if b[i] then
begin
inc(s);
su[s]:=i;
for j:=1 to n div i do
b[i*j]:=false;
end;
fillchar(p,sizeof(p),0);
sum:=n-2;
k:=n;
for i:=1 to n do
if a[i]<>-1 then
begin
for j:=1 to a[i]-1 do
begin
add(sum,1);
dec(sum);
add(j,-1);
end;
dec(k);
end;
c:=1;
fillchar(ans,sizeof(ans),0);
ans[1]:=1;
for i:=1 to s do
for j:=1 to p[i] do
cheng(su[i]);
for i:=1 to sum do
cheng(k);
for i:=c downto 1 do
write(ans[i]);
end.


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: