zoukankan      html  css  js  c++  java
  • UVa 12716 GCD XOR (简单证明)

    题意: 问 gcd(i,j) = i ^ j  的对数(j <=i <= N ) N的范围为30000000,有10000组例子

    思路:GCD(a,b) = a^b = c

    GCD(a/c,b/c) = 1 (1)

    (a-b) <= c (2)

    (a/c-b/c) <=1 (3)

    (1)(3) => a/c-b/c = 1=> a-b=c

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <vector>
    #include <string>
    #include <algorithm>
    #include <queue>
    #include <set>
    #include <map>
    #include <cmath>
    using namespace std;
    const int maxn = 30000000+10;
    typedef long long LL;
    int N;
    int ret[maxn];
    
    void init() {
        for(int i = 3; i < maxn; i+=2) ret[i] = 1;
        for(int i = 2; i < maxn/2; i++) {
            for(int j = i+i; j < maxn; j += i) {
                int k = j-i;
                if( (k^j) == i){
                    ret[j]++;
                }
            }
        }
        for(int i = 1; i < maxn; i++) ret[i] += ret[i-1];
    }
    int main(){
        int ncase,T=1;
        init();
        cin >> ncase;
        while(ncase--) {
            scanf("%d",&N);
            printf("Case %d: %d
    ",T++,ret[N]);
        }
        return 0;
    }
    



  • 相关阅读:
    Linux进程监控命令
    自学Java第九天
    自学Java第十天
    自学Java第八天
    自学Java第七天
    自学Java第六天
    Java第五天
    Java练习第四天
    自学Java第三天
    自学Java第二天
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/7008771.html
Copyright © 2011-2022 走看看