zoukankan      html  css  js  c++  java
  • ARC066B

    ARC066B

    给定 (N(1le Nle 10^{18})),求 (u,vin [0,N]) 中有多少对 ((u,v)) 满足存在 (a,b) 满足 (aoplus b=u,a+b=v)

    ( m Sol:)

    观察到 (v-u=(a& b) imes 2),不妨对 (a&b(x))(aoplus b(u)) 进行计数。

    考虑对 (a,b) 进行计数,假设当前位 (a,b) 均为 (0) 或为 (1),那么对应的 (u,x) 位的数被唯一确定,否则为 ((0,1)) 则可以交换。

    于是假设有 (m)01,那么对答案的贡献为 (frac{1}{m})(于是可以直接数位 dp 统计,复杂度 (mathcal O(log^2 n))

    观察到一组 (a,b) 对答案有贡献当且仅当 (a+ble n),不难注意到交换 ((0,1)) 对的位置对 "和" 无影响,于是强制让 (a) 此位为 (0)(b)(1) 即可。

    然后数位 dp 就是 (mathcal O(log n))

    然而实际上可以直接算,设 (f_i) 表示满足 (a+ble i) 且合法的 ((a,b)) 组数量,然后直接从后往前填数,那么可以得到转移(当前填的数是最后一位)(f_i=f_{frac{i}{2}}+f_{frac{i-1}{2}}+f_{frac{i-2}{2}})

  • 相关阅读:
    POJ 2251 Dungeon Master
    HDU 3085 Nightmare Ⅱ
    CodeForces 1060 B Maximum Sum of Digits
    HDU 1166 敌兵布阵(树状数组)
    HDOJ 2050 折线分割平面
    HDU 5879 Cure
    HDU 1878 欧拉回路
    HDU 6225 Little Boxes
    ZOJ 2971 Give Me the Number
    HDU 2680 Choose the best route
  • 原文地址:https://www.cnblogs.com/Soulist/p/13653603.html
Copyright © 2011-2022 走看看