Codechef March Challenge 2018 DIV 1 题解

Mix the Colors

显然每次选最大的数加到一个数上是最优的,那么答案就是 n n − 颜 色 种 数
代码

Chef and Easy Problem

预处理出每个二进制位的前缀和,询问时枚举每一位贪心选就好了。
代码

Minions and Voting

枚举每个点,二分出他会投给谁,正反各做一遍就好了。
代码

Chef and Gcd Queries

ans=i=LRt|ai,t|Gμ(t)=t|Gμ(t)i=LR[t|ai] a n s = ∑ i = L R ∑ t | a i , t | G μ ( t ) = ∑ t | G μ ( t ) ∑ i = L R [ t | a i ]

对于每个值开个动态线段树,复杂度 O(nmaxlogn) O ( n m a x log ⁡ n )
代码

Pishty and Triangles

一种比较显然的做法是从大到小枚举最大的 3 3 个数作为 3 条边,判断是否合法,如果合法就输出,否则去掉最大的数继续找。发现最多只会判断 O(log32max) O ( log 3 2 ⁡ m a x ) 次,用线段树维护前 50 50 大就好了。
代码

Chef and Interval Painting

打表,然后放到oeis上找一下可以得到:

ans=i=0k1(k1i)sn+1,ni a n s = ∑ i = 0 k − 1 ( k − 1 i ) s n + 1 , n − i

其中 sn+1,ni s n + 1 , n − i 表示第一类斯特林数。
可以用分治FFT预处理出第一类斯特林数。
代码

Chef Cuts Tree

一个连通块 S S 的权值可以表示为 i,j[iS,jS] ,即连通的点对数。
显然一对点连通的概率只取决于它们的距离。
toti t o t i 表示树中长度为 i i 的路径条数。假设我们已经求出了 tot 数组,那么删去 k k 条边的答案就是

ansk=i=0n1ktoti(n1ik)(n1k)

(n1k)k!ansk=i=0n1ktoti(n1i)!(n1ik)! ( n − 1 k ) k ! a n s k = ∑ i = 0 n − 1 − k t o t i ( n − 1 − i ) ! ( n − 1 − i − k ) !

ck=ki=0toti(n1i)!(ki)! c k = ∑ i = 0 k t o t i ( n − 1 − i ) ! ( k − i ) ! ,那么 (n1k)k!ansk=cn1k ( n − 1 k ) k ! a n s k = c n − 1 − k
ai=toti(n1i)!,bi=1i! a i = t o t i ( n − 1 − i ) ! , b i = 1 i ! ,于是 ck=ki=0aibki c k = ∑ i = 0 k a i b k − i ,是个卷积的形式,可以FFT求出。
现在的问题就是如何求出 tot t o t 数组。
考虑点分治,发现合并的时候是一个卷积的形式,用FFT优化就好啦。
由于模数不是NTT模数,要用三模数NTT。
还要卡卡常。。。
代码

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值