Cod sursa(job #1625932)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 2 martie 2016 21:25:20
Problema Principiul includerii si excluderii Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <bits/stdc++.h>
#define DIM 1000002

using namespace std;

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

long long a,b,K;

long long v[DIM],ciur[DIM],prim[DIM],primcnt;

long long T;

int main(){

    fin >> T;

    for(int i=2;i<DIM;i++)
        if(!ciur[i]){
            for(int j=i+i;j<DIM;j+=i)
                ciur[j]=1;
            prim[++primcnt] = i;
        }

    while(T--){
        fin >> a >> b;
        K=0;

        for(int i=1;i<=primcnt && prim[i]<=b;i++)
            if(b%prim[i]==0)
                v[++K]=prim[i];

        long long mask = (1<<K) - 1;
        long long ans=0;

        for(int i=1;i<=mask;i++){
            long long P=1,cnt=0;
            for(int j=0;j<K;j++)
                if((i&(1<<j))){
                    P*=v[j+1];
                    cnt++;
                }
            if(cnt%2)
                ans += a/P;
            else
                ans -= a/P;
        }

        ans = a - ans;

        fout << ans << "\n";
    }

    fin.close();fout.close();

    return 0;
}