Mix the Colors
显然每次选最大的数加到一个数上是最优的,那么答案就是
n−颜色种数
n
−
颜
色
种
数
。
代码
Chef and Easy Problem
预处理出每个二进制位的前缀和,询问时枚举每一位贪心选就好了。
代码
Minions and Voting
枚举每个点,二分出他会投给谁,正反各做一遍就好了。
代码
Chef and Gcd Queries
对于每个值开个动态线段树,复杂度 O(nmax−−−−√logn) O ( n m a x log n ) 。
代码
Pishty and Triangles
一种比较显然的做法是从大到小枚举最大的
3
3
个数作为 条边,判断是否合法,如果合法就输出,否则去掉最大的数继续找。发现最多只会判断
O(log32max)
O
(
log
3
2
m
a
x
)
次,用线段树维护前
50
50
大就好了。
代码
Chef and Interval Painting
打表,然后放到oeis上找一下可以得到:
其中 sn+1,n−i s n + 1 , n − i 表示第一类斯特林数。
可以用分治FFT预处理出第一类斯特林数。
代码
Chef Cuts Tree
一个连通块
S
S
的权值可以表示为 ,即连通的点对数。
显然一对点连通的概率只取决于它们的距离。
设
toti
t
o
t
i
表示树中长度为
i
i
的路径条数。假设我们已经求出了 数组,那么删去
k
k
条边的答案就是
设 ck=∑ki=0toti(n−1−i)!(k−i)! c k = ∑ i = 0 k t o t i ( n − 1 − i ) ! ( k − i ) ! ,那么 (n−1k)k!ansk=cn−1−k ( n − 1 k ) k ! a n s k = c n − 1 − k
设 ai=toti(n−1−i)!,bi=1i! a i = t o t i ( n − 1 − i ) ! , b i = 1 i ! ,于是 ck=∑ki=0aibk−i c k = ∑ i = 0 k a i b k − i ,是个卷积的形式,可以FFT求出。
现在的问题就是如何求出 tot t o t 数组。
考虑点分治,发现合并的时候是一个卷积的形式,用FFT优化就好啦。
由于模数不是NTT模数,要用三模数NTT。
还要卡卡常。。。
代码