题面
见此
思路
4k⊕4k+1⊕4k+2⊕4k+3=0
这样就可以快速处理出x的值。
我们设fi,j,k=0/1,t=0/1表示我考虑了二进制的前i位(0∼i),当前位将向下进位的值是j,j∈0∼n,k表示b是否大于0:true/false,t表示前i位是否大于n,此时的方案数。
(b大于或等于0)
那就可以从低位到高位进行 DP 了,初始时f−1,0,0,0=1
转移方程是:
fi+1,y,Ob∣t,0/1+=fi,j,t,k
这里y=⌊2Oa+Ob+Oc+j⌋。
Ox代表x的当前这一位的值,由于要满足(a+b+c)⊕a⊕c=x,因此设z=Oa+Ob+Oc(mod2),z⊕Oa⊕Oc=Ox。而这位的Oa,Ob,Oc分别枚举一下就好了,选出符合这个条件的进行转移。
n个二进制数加起来最多进n−1位,三个数最多进2位。
至于≤n,假如下一位小于n的下一位,那么就是小于
n,为0,假如下一位和n相同,那就继承上一个状态,因为还要接着比下去,如果下一位比n大,那就是大于,为1。
最后的答案就是f60,0,1,0,因为1e18的二进制位数不会超过60位。