题目大意
有一个无限长的数轴,每一个点的值是0/1,现在给你每一个是1的点的位置(不超过100个),每次可以把一段奇素数长度的值都抑或1,求最少多少步可以把整个序列都变成0
题解
直接做好像很难,完全没有思路
看了一下题解
发现是把这个东西差分了一下,就是设一个
bi=aixorai−1
b
i
=
a
i
x
o
r
a
i
−
1
这样做有什么好处呢?
可以发现原来的对一段的修改变成了对b中两个端点的修改
那么题目就变成了每一次可以改距离为奇素数的两个点,问要多少次可以把序列全变成零
然后就又不会了超绝望
继续看题解,题解说可以把b中为1的点两两配对
然后如果一对的距离为奇素数那么就需要1步
如果是偶数就需要两步(分解成两个奇素数的和或差)
如果是奇合数就要三步(分解成偶数和奇素数)
这样为什么是对的呢
首先需要三步的情况是只会出现一次的,因为两边各出现两个就变成前面的情况了(最少能变成两个两步)
现在要证明的是把多与两个捆绑起来并不会更优
对于只有一步的情况肯定是直接放不会亏的
对于两步的情况我们如果想要覆盖其中一个点一定要造成一个亏损点(就是0变成了1)那么至少还要1步来解决这个问题
三步的话。。。应该也可以用类似的方法来证明
设有c1个奇数点,c2个偶数点,配对出了tot个奇素数
那么ans=tot+(c1-tot)*2+(c2-tot)*2+((c1-tot)%2)*3;
容易发现tot大就很赚了
那么直接对于奇偶做一个二分图,差是奇素数就连流量为1的边,跑一遍最大匹配