Cod sursa(job #2939356)

Utilizator alexandru_ioan.06Alexandru Ioan alexandru_ioan.06 Data 13 noiembrie 2022 16:08:12
Problema Principiul includerii si excluderii Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.85 kb
#include <fstream>
#include <bitset>
#include <vector>

using namespace std;
ifstream cin ("pinex.in");
ofstream cout ("pinex.out");

const int dim = 1e6;

bitset <dim+2> sieve;
vector<int> prime , v;
void Eratostene()
{
    prime.push_back(2);
   for(int i = 4 ; i <= dim ; i += 2)
        sieve[i] = true;
    for(int i = 3 ; i * i <= dim ; i += 2)
        if(sieve[i] == false)
            {
                prime.push_back(i);
                for(int j = i * i ; j <= dim ; j += 2 * i)
                    sieve[j] = true;
            }
}

int main()
{
    Eratostene();
    unsigned int n;
    cin >> n;
    while(n--)
        {
            long long a , b;
            cin >> a >> b;
            // Descompun in factori primi
            v.clear();
            for(int i = 0 ; (long long) prime[i] * prime[i] <= b; ++i)
                {
                    if(b % prime[i] == 0)
                        {
                            v.push_back(prime[i]);
                            while(b % prime[i] == 0)
                                b /= prime[i];
                        }
                }
            if(b > 1)
                v.push_back(b);
            long long rasp = a;
            // Generez toate modalitatile de a alege submultimi din toti factorii primi
            for(int i = 1 ; i < (1<<(v.size())) ; ++i)
                {
                    int biti = 0;
                    unsigned long long l = 1;
                    for(int j = 0 ; j < v.size() ; ++j)
                        if(i & (1<<j))
                            {
                                 ++biti;
                                l *= v[j];
                            }
                  //if(!biti) continue;
                 if(biti % 2)
                    rasp -= a/l;
                else
                    rasp += a/l;
                }
            cout << rasp << '\n';
        }
}