【NOIP提高组模拟】树上摩托

5 篇文章 0 订阅

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值