Cod sursa(job #1625980)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 2 martie 2016 21:41:52
Problema Principiul includerii si excluderii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>
#include <bitset>
#define DIM 1000002
using namespace std;

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

bitset <DIM> v;
bitset <70> s;
long long M,mask,A,B,prim[DIM],N,a[DIM],k;
void ciur(){
    v[1]=v[0]=1;
    for(int i=2;i<=DIM;i++){
        if(!v[i]){
                prim[++N]=i;
            for(int j=i+i;j<=DIM;j+=i)
                v[j]=1;
        }
    }
}
int main(){
    ciur();
    fin>>M;
    while(M--){
        fin>>A>>B;
        k=0;
        for(int i=1;i<=N && prim[i]<B;i++){
            if(B%prim[i]==0){
                a[++k]=prim[i];
                while(B%prim[i]==0)
                    B/=prim[i];
            }
        }
        if(B>1)
            a[++k]=B;
        s.reset();
        long long sol=0;
        for(int mask=1;mask<(1<<k);mask++){
            int par=0;
            long long produs=1;
            for(int i=0;i<k;i++)
                if((mask&(1<<i))!=0){
                    par++;
                    produs*=a[i+1];
                }
            if(par%2)
                sol+=A/produs;
            else
                sol-=A/produs;
        }
        fout<<A-sol<<"\n";
    }
    fin.close();fout.close();
    return 0;
}