Cod sursa(job #990328)

Utilizator classiusCobuz Andrei classius Data 27 august 2013 22:44:06
Problema Principiul includerii si excluderii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>

using namespace std;

ifstream f("pinex.in");
ofstream g("pinex.out");

int count(int x){
    int s=0;
    for(int i=0;(1<<i)<=x;i++)
        s+=(bool)((1<<i)&x);
    return s;
}

int main()
{
    int *pr=new int[1000001];
    bool *ok=new bool[1000001];

    for(int i=2;i<1000001;i++)
        if(!ok[i]){
            pr[++pr[0]]=i;
            for(int j=2;i*j<1000001;j++) ok[i*j]=1;
        }

    int nrc;
    f>>nrc;

    while(nrc--){
        unsigned long long a,b,s=0;
        f>>a>>b;
        unsigned long long np[101];
        np[0]=0;

        for(int i=1;i<=pr[0]&&b!=1;i++){
            if(b%pr[i]==0){
                np[++np[0]]=pr[i];
                while(b%pr[i]==0)
                    b/=pr[i];
            }
        }
        if(b!=1)
            np[++np[0]]=b;
        int n=np[0];
        for(int i=1;i<(1<<n);i++){
            int m=count(i);
            unsigned long long prs=1;
            for(int j=1;j<=n;j++)
                if((1<<(j-1))&i)
                    prs*=np[j];
            if(m%2) s+=a/prs;
            else s-=a/prs;
        }
        g<<a-s<<'\n';
    }

    return 0;
}