[BJOI2018]二进制 题解

题目链接

题目描述:

pupil 发现对于一个十进制数,无论怎么将其的数字重新排列,均不影响其是不是 的倍数。他想研究对于二进制,是否也有类似的性质。
于是他生成了一个长为n 的二进制串,希望你对于这个二进制串的一个子区间,能求出其有多少位置不同的连续子串,满足在重新排列后(可包含前导0)是一个3 的倍数。
两个位置不同的子区间指开始位置不同或结束位置不同。
由于他想尝试尽量多的情况,他有时会修改串中的一个位置,并且会进行多次询问。

首先考虑一个子问题:判断一个子串是否满足条件。
首先,二进制化为十进制的方法是对应位×位权。
可以发现,位权\(mod3\)的值是\(1,2,1,2\)交替。
设这个子串有x个1放在2上,y个放在1上,则应满足\((2x+y)mod3=0\),即\(x=y(mod3)\)
设该子串长度为len,有s个1。
那么,贪心的想,x和y相差0或3。
分情况讨论:

  1. \(len\%2=0\)\(s%2=0\)。需要满足\(s/2<=len/2\),显然可以。
  2. \(len%2=0\)\(s%2=1\)。即\(x+y=s,x-y=3\),解得\(x=(s+3)/2\)。需要满足\((s+3)/2<=len/2\),即\(s<=len-3\)
  3. \(len%2=1\)\(s%2=0\)。需要满足\(s/2<=(len-1)/2\),显然可以。
  4. \(len%2=1\)\(s%2=1\)。同理,\(x=(s+3)/2\)。需要满足\((s+3)/2<=(len+1)/2\),即\(s<=len-2\)
    可以发现,s为偶数时一定可以。s为奇数时比较复杂,难以统计(因为即使len确定,满足要求的s有很多,无法进行区间合并)。
    考虑容斥,求不合法的。
    若不合法,则\(s%2=1\)

猜你喜欢

转载自www.cnblogs.com/lnzwz/p/11348249.html
今日推荐