zoukankan      html  css  js  c++  java
  • UVa 12716 GCD XOR

    题目

    题目大意

    输入整数(n)((1 ≤ n ≤ 30000000)), 有多少对整数((a, b))满足: (1 ≤ b ≤ a ≤ n), 且((a, b) = a ⊕ b)(这里((a, b))表示(a)(b)的最大公约数, (⊕)表示按位异或运算)。例如(n = 7)时, 有(4)对: ((3, 2)), ((5, 4)), ((6, 4)), ((7, 6))

    题解

    由于最大公约数和按位异或看起来毫不相关, 可以先写个暴力程序打一些满足((a, b) = a ⊕ b = c)的表, 然后观察可以发现: (c = a - b)

    证明如下: 刘汝佳说不难发现(a - b ≤ a ⊕ b), 且(a - b ≥ c)。假设存在(c)使得(a - b > c), 则(c < a - b ≤ a ⊕ b), 与(c = a ⊕ b)矛盾。

    有了这个结论, 枚举(a)(c), 计算(b = a - c), 则((a, b) = (a, a - c) = c), 此时就只需要验证(c = a ⊕ (a - c))了。

    代码

    #include <cstdio>
    int form[30000010], T, n;
    int main(int argc, char **argv) {
      for (register int c(1); c <= 15000000; ++c) {
        for (register int a(c << 1); a <= 30000000; a += c) {
          if ((a ^ (a - c)) == c) ++form[a];
        }
      }
      for (register int i(2); i <= 30000000; ++i) form[i] += form[i - 1];
      scanf("%d", &T);
      for (register int i(1); i <= T; ++i) {
        scanf("%d", &n);
        printf("Case %d: %d
    ", i, form[n]);
      }
      return 0;
    }
    
  • 相关阅读:
    XJOI网上同步训练DAY2 T2
    XJOI网上同步训练DAY2 T1
    BZOJ 2661 连连看
    HDU 4411 Arrest
    BZOJ 2324 营救皮卡丘
    BZOJ 1927 星际竞速
    BZOJ 3550 Vacation
    XJOI网上同步训练DAY1 T3
    php 类的相互访问
    ThinkPhp5.0_文件上传
  • 原文地址:https://www.cnblogs.com/forth/p/9713911.html
Copyright © 2011-2022 走看看