Cod sursa(job #1533573)

Utilizator moise_alexandruMoise Alexandru moise_alexandru Data 22 noiembrie 2015 18:34:49
Problema Principiul includerii si excluderii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <iostream>
#include <fstream>
#include <bitset>
#include <vector>
using namespace std;
ifstream in("pinex.in");
ofstream out("pinex.out");

const int maxv = 1000005;
bitset <maxv> ciur;
vector <int> primes;
vector <int> divi;
int main()
{
    int T;
    in >> T;
    ciur[2] = 0;
    ciur[1] = 1;
    ciur[0] = 1;
    for(int i = 4; i < maxv; i+=2)
        ciur[i] = 1;
    for(int i = 3; i < maxv; i+=2)
        if(ciur[i] == 0)
            for(int j = i * 2; j < maxv; j+=i)
                ciur[j] = 1;
    for(int i = 2; i < maxv; i++)
        if(!ciur[i])
            primes.push_back(i);
    for(int z = 1; z <= T; z++)
    {
        long long a, b;
        in >> a >> b;
        divi.clear();
        for(unsigned int i = 0 ; i < primes.size() && 1LL * primes[i] * primes[i] <= b ; ++ i) {
            if(b % primes[i] == 0) {
                divi.push_back(primes[i]);
                while(b % primes[i] == 0)
                    b /= primes[i];
            }
        }
        if(b != 1)
            divi.push_back(b);

        /// abcdefgh
        /// 00001000 &
        /// 00000000
        int n = divi.size();
        long long rasp = 0;
        for(int conf = 1; conf < (1 << n); conf++)
        {
            int nrb = 0;
            long long p = 1;
            for(int i = 0 ; i < n ; ++ i)
                if(conf & (1 << i)) {
                    nrb++;
                    p = p * divi[i];
                }
            if(nrb % 2 == 1)
                rasp += a/p;
            else
                rasp -= a/p;
        }
        out << a - rasp << "\n";
    }
    return 0;
}