为了能到远方,脚下的每一步都不能少.|

园龄:粉丝:关注:

ARC080F

题目大意:

有无限枚硬币,其中有N枚硬币x1N初始时正面朝上,其余均为背面朝上,每次可以选择一段区间[l,r],将区间内所有硬币翻转,其中rl+1为一个奇数质数;问最少多少次能将所有硬币全部翻为背面朝上。

  • 1 < = N < = 100
  • 1 < = x1 < x2 < ... < xN < = 107

一个很容易想到的思路就是把硬币看成正着的事 1 ,反面是 0 ,做一个异或前缀和

即初始,对于数组 aax1=1  ax2=1  axn=1 ,其余为0

令数组 bbi=ai xor ai1

操作是数组 a 对于 [l,l+p1] 异或 1

容易发现在数组 b 上,这个操作相当于对 bl1 xor 1bl+p1 xor 1

也就是每次对数组 b 上相差为奇质数的下标取反

考虑最初的数组 b ,显然会有偶数个 1

可以感性的想一想,可以转化成每次通过几次操作删掉两个 1

(至于为什么可以这样想,lg讨论区有一个简短的证明)

于是,我们令 f(l,r) 表示删掉 lr 上的 1 的最小操作次数

rl=k

显然,当 k 是一个奇质数时,f(l,r)=1

接下来将 k 分为奇数和偶数考虑

k=2 ,可以通过两次操作完成,即将 (l,l+7)(l+2,l+7) 取反

k=4 ,可以通过两次操作完成,即将 (l,l+7)(l+4,l+7) 取反

k6

由于哥德巴赫定理,必有奇质数 pq 满足 p+q=k

所以只需要将 (l,l+p)(l+p,l+p+q) 取反即可

k=1 ,可以通过三次操作完成,即将 (l,l+7)(l+4,l+7)(l+1,l+4) 取反

k9

先将 (l,l+3) 取反,然后就变成了一个 k3 的偶数情况

所以总共 3 次可以解决

总结一下:

k 为奇质数时,f(l,r)=1

k 为偶数时,f(l,r)=2

k 为奇合数时,f(l,r)=3

有一个比较显然的贪心策略,就是从代价为 1 的优先考虑,能删就删

(贪心正确性可以自己想一下,应该是比较简单的)

考虑差为奇质数的情况,由于差是奇数,所以两个位置的奇偶性不同,可以按奇偶性分类

我们对差为奇质数的两个点直接连边,这样就相当于求一个二分图的最大匹配

求完最大匹配后剩下来的一些点,奇偶性相同的点可以用第二种方法删

最后要么剩下一奇一偶,要么删完了

如果剩一奇一偶,那就在加 3 次操作

本文作者:kent

本文链接:https://www.cnblogs.com/kentsbk/p/18650933

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Kent530  阅读(9)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起