Cod sursa(job #2164010)

Utilizator Claudiu07Pana Claudiu Claudiu07 Data 12 martie 2018 21:01:16
Problema Principiul includerii si excluderii Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("pinex.in");
ofstream g("pinex.out");
int M, nr, x[50], k;
long long A,B,rez,divs[50];
int pr[80000];
bool v[1000005];
void ciur(long long n)
{
    int i, j;
    v[0]=1;
    v[1]=1;
    for(i=4; i<=n; i+=2)
        v[i] = 1;
    for(i=3; i*i<=n; i+=2)
    {
        if(v[i]==0)
            for(j=i*i; j<=n; j+=i)
                v[j]=1;
    }
    pr[1]=2;
    nr=1;
    for(int i=3; i<=n; i+=2)
        if(v[i]==0)
            pr[++nr]=i;
}
void add(int n)
{
    int s=1;
    long long p=1;
    for(int i=1; i<=n; i++)
        if(x[i]==1)
        {
            s*=-1;
            p*=divs[i];
        }
    rez+=s*A/p;
}
void backt(int n)
{
    k=1;
    x[1]=-1;
    while(k>0)
        if(x[k]<1)
        {
            x[k]++;
            if(k==n)
                add(n);
            else
            {
                k++;
                x[k]=-1;
            }
        }
        else
            k--;
}
void sol()
{
    int poz=0;
    for(int crt=1; crt<=nr && 1LL*pr[crt]*pr[crt]<=B; crt++)
        if(B%pr[crt]==0)
        {
            divs[++poz]=pr[crt];
            do
            {
                B/= pr[crt];
            }
            while(B%pr[crt]==0);
        }
    if(B>1)
    {
        divs[++poz]=B;
    }
    rez=0;
    backt(poz);
}
int main()
{
    f>>M;
    ciur(1000000);
    for(int i=1; i<=M; i++)
    {
        f>>A>>B;
        sol();
        g<<rez<<'\n';
    }
    return 0;
}