Cod sursa(job #708972)

Utilizator deneoAdrian Craciun deneo Data 7 martie 2012 16:24:38
Problema Principiul includerii si excluderii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
using namespace std;

ifstream fin("pinex.in");
ofstream fout("pinex.out");

long long a, b, n, div[1000], nrdiv = 0, rez = 0;
bool isPrim[2000010];
int divPrim[10001], nDiv;

void ciur() {
    int i, j;
    for(i = 2; i <= 2000000; ++i) {
        if(!isPrim[i]) {
            divPrim[++nDiv] = i;
            for(j = 2 * i; j <= 2000000; j += i)
                isPrim[j] = 1;
        }
    }
}

void doPinex(int last, int anad, long long sum) {
    int i;
    if(anad != 0)
        if(anad % 2 == 0)
            rez += (a / sum);
        else
            rez -= (a / sum);
    for(i = last; i <= nrdiv; ++i)
        doPinex(i + 1, anad + 1, sum * div[i]);
}

int main() {
    int i, j;
    fin >> n;
    ciur();
    for(i = 1; i <= n; ++i) {
        fin >> a >> b;
        nrdiv = 0;
        for(j = 1; divPrim[j] * divPrim[j] <= b; ++j)
            if(b % divPrim[j] == 0) {
                div[++nrdiv] = divPrim[j];
                while(b % divPrim[j] == 0)
                    b /= divPrim[j];
            }
        if(b != 1)
            div[++nrdiv] = b;
        rez = a;
        doPinex(1, 0, 1);
        fout << rez << "\n";
    }
    fout.close();
    return 0;
}