Atcoder Xor Sum 1月5日

来源:互联网 发布:天刀彭于晏捏脸数据 编辑:程序博客网 时间:2024/05/16 08:47

【题目链接】点击打开链接

【题意】

  题意  

给定一个整数N,求出有多少对u, v (0 <= u, v <= N),满足存在两个非负整数a和b使得a xor b = u 且 a + b = v。xor为异或操作。

  数据  

(1 <= N <= 1e18), , 方案数mod 1e9+7。

  输入  

3

1422

1000000000000000000

  输出  

5

52277

787014179

  说明  

样例1:

u=0,v=0 (Let a=0,b=0, then 0 xor 0=0, 0+0=0.)

u=0,v=2 (Let a=1,b=1, then 1 xor 1=0, 1+1=2.)

u=1,v=1 (Let a=1,b=0, then 1 xor 0=1, 1+0=1.)

u=2,v=2 (Let a=2,b=0, then 2 xor 0=2, 2+0=2.)

u=3,v=3 (Let a=3,b=0, then 3 xor 0=3, 3+0=3.)


【解题方法】一眼就不会做的题。只好看Wannafly的题解理解下了。

按位考虑,因为a xor b = a+b-2(a and b)<=a+b,实际上只需要考虑a+b<=n,
现在要求a的每一位不大于b的每一位,那么对于两组不同的(a1,b1)和(a2,b2),
如果a1 xor b1等于a2 xor b2,则必定存在某些位,在一组中是(0,0)而在另一组中是(1,1),故此时a1+b1不等于a2+b2,
这表明每种(a,b)的取法都会导致不同的(a xor b,a+b),接下来有两种解法:
(1)数位dp,记dp[i][3][3][2]为填好了a和b的最低i位,
此时a xor b和N的后i位的大小关系(实际上这一维可以省去),a+b和N的后i位的大小关系,
a+b是否还要向上进位这个情况下的方案数,
复杂度O(logn)。
(2)记dp[i]为满足a+b<=i的(a,b)对的个数,枚举a和b的最低位,记a=2a1+a2,b=2b1+b2,其中a2,b2=0,1且a2<=b2,
那么有a1+b1<=(n-a2-b2)/2,因为a2+b2只能是0,1,2,则有dp[i]=dp[i/2]+dp[(i-1)/2]+dp[(i-2)/2],
那么对于dp[n],可以分析出需要计算的状态数是O((logn)^2)的。

第一种做法代码:http://abc050.contest.atcoder.jp/submissions/1052617

第二种做法代码:http://abc050.contest.atcoder.jp/submissions/1052656

0 0
原创粉丝点击