Cod sursa(job #2175649)

Utilizator dumitrescu_andreiDumitrescu Andrei dumitrescu_andrei Data 16 martie 2018 18:17:07
Problema Principiul includerii si excluderii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <bits/stdc++.h>
using namespace std;

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

bool ok[1000005];
int prim[1000005];
long long fact[50];
long long n,a,b;

void ciur()
{
    memset(ok,1,sizeof(ok));
    for(int i=2;i<1000000;++i)
        if(ok[i])
        {
            prim[++prim[0]]=i;
            int j=2;
            while(i*j<=1000000)
            {
                ok[i*j]=0;
                j++;
            }
        }
}

void solve()
{
    long long t=0,d=0;

    while(b>1)
    {
        d++;
        if(b%prim[d]==0)
        {
            fact[++t]=prim[d];
            while(b%prim[d]==0)
            {
                b/=prim[d];
            }
        }
        if(prim[d]>sqrt(b) && b>1)
        {
            fact[++t]=b;
            b=1;
        }

    }


    long long ans=a;

    for(int i=1;i<(1<<t);++i)
    {
        long long nr=0;
        long long prod =1 ;

        for(int j=0;j<t;++j)
            if((1<<j)&i)
            {
                prod = 1LL*prod*fact[j+1];
                nr++;
            }
        if(nr%2)
            nr=-1;
        else
            nr=1;
        ans = ans +1LL*nr*a/prod;

    }

    g<<ans;

}

int main()
{
    ciur();
    f>>n;
    for(int i=1;i<=n;++i)
    {
        f>>a>>b;
        solve();
        g<<'\n';
    }
    return 0;

}