UVa 12716 GCD XOR (간단 한 증명)

1149 단어 수학.LCMorGCD
제목: 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 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
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; }

좋은 웹페이지 즐겨찾기