【题解】CF1554E - You

题意:给你一棵树,每次删除一个节点 i i i 和所连的边, a [ i ] a[i] a[i] 表示当前点所连的边的条数。令 g c d ( a [ 1 ] , a [ 2 ] , . . . , a [ n ] ) = k gcd(a[1],a[2],...,a[n])=k gcd(a[1],a[2],...,a[n])=k ,求对于 k ∈ [ 0 , n ] k\in [0,n] k[0,n] 的不同序列 a a a 的个数。

solution:

观察到不同的操作顺序可能决定相同的序列 a a a 。例如,所有孤岛的入度为 0 0 0 ,而最终得到的序列只能是 0 {0} 0

方便起见,我们假设 ( u , v ) (u,v) (u,v) 的有向边表示 u u u v v v 先删除,注意 ( u , v ) (u,v) (u,v) 一定是树上的边。这样题意就转化为给每一条边 ( u , v ) (u,v) (u,v) 钦定方向,每个节点的值为 o u t [ i ] out[i] out[i]

因为 ∑ i = 1 n o u t [ i ] = n − 1 \sum_{i=1}^n out[i]=n-1 i=1nout[i]=n1 ,所以如果 k k k 有方案的话,那么 k ∣ n − 1 k|n-1 kn1

于是考虑枚举 k k k 。如果 k = 1 k=1 k=1 那么 f ( k ) = 2 n − 1 f(k)=2^{n-1} f(k)=2n1 。否则 k > 1 k>1 k>1 。那么叶节点是可以确定的。 从下往上传递信息,对于每一个点只有 1 1 1 条边可以支配,可以贪心地选择。

时间复杂度 O ( n d ( n ) ) O(nd(n)) O(nd(n))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值