Cod sursa(job #1100435)

Utilizator costyrazvyTudor Costin Razvan costyrazvy Data 6 februarie 2014 21:30:31
Problema Principiul includerii si excluderii Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>
#define ll long long
#define tix 1000000
using namespace std;
ll a,b,i,n,fact[80005],j,sum,cb,ir,ci;
ll x[105];
int main()
{
    ifstream f("pinex.in");
    ofstream g("pinex.out");
    f>>n;
    ll prod,p,fp,k,t;
    bool ok[1000005];
    for (i=2; i<=tix; i++)
        if (ok[i]==false)
        {
            fact[++fact[0]]=i;
            for (j=2*i; j<=tix; j+=i) ok[j]=true;
        }
    //ciur
    for (i=1; i<=n; i++)
    {
        f>>a>>b;
        cb=b;
        fp=0;
        sum=0;
        t=0;
        while (cb>1&&fact[fp]*fact[fp]<=cb)
        {
            fp++;
            if (cb%fact[fp]==0)
            {
                x[++t]=fact[fp];
                while (cb%fact[fp]==0) cb/=fact[fp];
            }
        }
        if (cb!=1) x[++t]=cb;
        for (ir=1; ir<(1<<t); ir++)
        {
            ci=ir;
            p=-1;
            prod=1;
            k=0;
            while (ci>0)
            {
                p++;
                if (ci%2==1) prod*=x[p+1],k++;
                ci/=2;
            }
            if (k%2==0) sum-=(a/prod);
            else sum+=(a/prod);
        }
        g<<a-sum<<'\n';
    }
    f.close();
    g.close();
    return 0;
}