Cod sursa(job #2633876)

Utilizator DimaTCDima Trubca DimaTC Data 9 iulie 2020 00:35:54
Problema Principiul includerii si excluderii Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include<bits/stdc++.h>
#define N 1000005
#define int long long
using namespace std;

bool viz[N];
vector<int> V, c;
int n,pr,t, rs;

int get(int n, int a) {
    return (a)/n;
}
int32_t main() {
    ifstream cin("pinex.in");
    ofstream cout("pinex.out");
    for (int i=2; i*i<=1e6; i++) {
        if (!viz[i]) {
            for (int j=i*i; j<=1e6; j+=i) viz[j]=1;
            V.push_back(i);
        }
    }

    cin>>t;
    while (t--) {
        int a,b; cin>>a>>b;

        int i=2;
        while (i*i<=b) {
            int k=0;
            while (b%i==0) {b/=i, k++;}
            if (k) c.push_back(i), ++pr;
            ++i;
        }

        if (b>1) c.push_back(b), ++pr;

        for (int i=1; i<(1<<pr); i++) {
            int nr=1, k=0;
            for (int j=0; (1<<j)<=i; j++) {
                if ((1<<j) & i) {
                    nr = nr*c[j]; ++k;
                }
            }

            if (k&1) rs+=get(nr, a);
            else rs-=get(nr, a);
        }

        cout<<a-rs<<'\n'; c.clear(); rs=pr=0;
    }


    return 0;
}