Cod sursa(job #1867802)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 4 februarie 2017 12:48:27
Problema Principiul includerii si excluderii Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <cstdio>
#include <cmath>

using namespace std;

bool prim[1000005];
long long p[80005], np, oa, sol;
int fact[80005], t, nr;
long long x, k, n;

void ciur() {
    int i, j;
    p[++np] = 2;
    for (i = 3; i <= 1000000; i+=2) {
        if (prim[i] == 0 && i%2) {
            p[++np] = i;
            for (j = i+i; j <= 1000000; j += i)
                prim[j] = 1;
        }

    }
}

void calc() {
    int i, j;
    t = 0;
    for (i = 1; k > 1; i++) {
        if (k%p[i]==0) {
            fact[++t] = p[i];
            while (k%p[i]==0)
                k/=p[i];
        }
        if (p[i]>sqrt(k) && k > 1) {
            fact[++t] = k;
            k = 1;
        }
    }

    sol = x;
    for (i = 1; i < (1<<t); i++) {
        oa = 1, nr = 0;
        for (j = 0; j < t; j++)
            if (((1<<j)&i))
                nr++, oa = 1LL*oa*fact[j+1];
        nr = (nr%2?-1:1);
        sol += 1LL*nr*x/oa;
    }
}

int main() {
    ciur();
    FILE *f = fopen("pinex.in", "r");
    FILE *g = fopen("pinex.out", "w");
    fscanf(f, "%d\n",&n);
    while (n--) {
        fscanf(f, "%d %d\n",&x,&k);
        //f >> x >> k;
        calc();
        //g << sol << '\n';
        fprintf(g,"%d\n",sol);
    }
    return 0;
}