Cod sursa(job #1519339)

Utilizator MayuriMayuri Mayuri Data 7 noiembrie 2015 11:11:44
Problema Principiul includerii si excluderii Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <cstdio>
#include <cmath>
#include <vector>

using namespace std;

vector <int> f;

void descompunere(int n) {
    int d = 2, e;
    while((long long) d * d <= n && n > 1) {
        e = 0;
        while(n % d == 0) {
            n /= d;
            ++ e;
        }
        if(e != 0) {
            f.push_back(d);
        }
        ++ d;
    }
    if(n > 1) {
        f.push_back(n);
    }
}

void solve(long long a, long long b) {
    f.clear();
    descompunere(b);
    long long n, cate, prod, nr, rasp = 0;
    nr = f.size();
    n = 1 << nr;
    for(long long i = 1; i < n; ++ i) {
        cate = 0;
        prod = 1;
        for(int j = 0; j < nr; ++ j) {
            if(i & (1LL << j)) {
                ++ cate;
                prod *= f[j];
            }
        }
        if(cate & 1) {
            rasp += a / prod;
        } else {
            rasp -= a / prod;
        }
    }
    printf("%lld\n", a - rasp);
}

int main() {
    freopen("pinex.in", "r", stdin);
    freopen("pinex.out", "w", stdout);

    int t;
    long long a, b;

    scanf("%d", &t);

    for(int i = 1; i <= t; ++ i) {
        scanf("%lld%lld", &a ,&b);
        solve(a, b);
    }

    return 0;
}