Description
Sherco是一位经验丰富的魔♂法师。
Sherco在第零次圣杯战争中取得了胜利,并取得了王之宝藏——王の树。
他想把这棵树砍去任意条边,拆成若干棵新树,并装饰在他的摩托上,让他的摩托更加酷炫。
但Sherco认为,这样生成的树不具有美感,于是Sherco想让每棵新树的节点数相同。
他想知道有多少种方法分割这棵树。
Solution
分析题目可知,要切割出若干棵大小相同的树,显然这些树的大小需要是N的倍数。然后我们还是需要证明另一个性质:对于同样大小的相同的树,只可能有一种切割方案。感性证明一下,这是一棵树,从叶节点开始向上走,当前节点个数等于枚举的答案时,就是一颗被分出来的新树,而由于整幅图都是一棵树,所以,对应的切边也只有一种方案。将原树看做一个有根树,一个节点可以作一个块的“根”当且仅当该节点的 size 能被块的大小整除,因为当一个节点的size是块大小的倍数时,意味着当它的某些节点被切割出来后,它就会成为其中的一棵树。当有 Nk 个节点的size是块大小的倍数时,就是一种合法方案。用一个桶来统计,就能比较快速地求出答案。
Code
var
node,last,t,fa,dl:array[1..1000000] of longint;
data,next:array[1..2000000] of longint;
n,i,j,ans,x,y,sum:longint;
procedure ins(x,y:longint);
begin
inc(sum);
data[sum]:=y;
next[sum]:=last[x];
last[x]:=sum;
end;
begin
readln(n);
for i:=1 to n-1 do
begin
readln(x,y);
ins(x,y);
ins(y,x);
end;
x:=0;y:=1;
dl[1]:=1;
while x