Cod sursa(job #1902938)

Utilizator mihai.alphamihai craciun mihai.alpha Data 4 martie 2017 21:08:17
Problema Principiul includerii si excluderii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <fstream>
#include <iostream>
#include <vector>

using namespace std;

ifstream f("pinex.in");
ofstream g("pinex.out");

#define lim 1000002

bool ciur[lim + 1];
vector <int> pri;

inline void CIUR()  {
    for(unsigned long long i = 2;i <= lim;i++)
        if(!ciur[i])  {
            pri.push_back(i);
            for(long long j = 1LL * i * i;j <= lim;j++)
                ciur[j] = 1;
        }
}

inline unsigned long long sqrt1(unsigned long long a)  {
    unsigned long long r = 0, pas = 1 << 30;
    while(pas)  {
        if((r + pas) * (r + pas) <= a)
            r += pas;
        pas >>= (unsigned long long)1;
    }
    return r;
}

unsigned long long A, B;
unsigned long long v[lim];

inline void desc()  {
    unsigned long long x = B, sqr = sqrt1(B);
    v[0] = 0;
    for(unsigned int i = 0;x != 1 && pri[i] <= sqr && i < pri.size();i++)
        if(x % pri[i] == 0)  {
            v[++v[0]] = pri[i];
            while(x % pri[i] == 0)
                x /= pri[i];
        }
    if(x != 1)  {
        v[++v[0]] = x;
    }
}

unsigned long long ans;

void bkt(unsigned long long k, unsigned long long p, unsigned long long nr)  {
    if(k == v[0] + 1)  {
        if(p != (unsigned long long)1 && p != 0)  {
            if(nr & 1)
                ans += A / p;
            else
                ans -= A / p;
        }
        return;
    }
    bkt(k + 1, p, nr);
    bkt(k + 1, p * v[k], nr + 1);
}

int main()  {
    unsigned long long M;
    f >> M;
    CIUR();
    while(M)  {
        M--;
        ans = (unsigned long long)0;
        f >> A >> B;
        desc();
        bkt(1, (unsigned long long)1, 0);
        g << A - ans << "\n";
    }
    f.close(), g.close();
    return 0;
}