Cod sursa(job #2280406)

Utilizator victorv88Veltan Victor victorv88 Data 10 noiembrie 2018 15:58:06
Problema Principiul includerii si excluderii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;

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

vector<int>primi;

long long n, a, b, divizori[100000],k,aux,lungime,suma,variabila;
bool ciur[1000005],viz[1000000];

void ciur_erath()
{
    ciur[0]=1;
    ciur[1]=1;
    for (int i=2; i<=1000000; i++)
    {
        if (ciur[i]==0)
        {
            primi.push_back(i);
            aux=i*2;
            while (aux<1000000)
                ciur[aux]=1,aux+=i;
        }
    }
}

void formdiv(long long b)
{
    for (int i=0; i<lungime; i++)
    {
        if (primi[i]*primi[i]>b)
            break;
        if (b%primi[i]==0)
        {
            divizori[k++]=primi[i];
            while (b%primi[i]==0)
            {
                b/=primi[i];
            }
        }
    }
    if (b>1)
    {
        divizori[k++]=b;
    }

}

void backt(long long lvl,long long ant)
{
    if (lvl==n+1)
        return;
    if (ant==k-1)
        return;
    for (int i=ant+1; i<k && divizori[i]<=a; i++)
    {
        variabila*=divizori[i];
        backt(lvl+1,i);
        if (lvl%2==0)
            suma-=(a/variabila);
        else
            suma+=(a/variabila);
        variabila/=divizori[i];
    }
}

int main()
{
    f >> n;
    ciur_erath();
    lungime=primi.size();
    for (int i=1; i<=n; i++)
    {
        suma=0;
        for (int i=0; i<k; i++)
            divizori[i]=0;
        k=0;
        f >> a >> b;
        variabila=1;
        formdiv(b);
        backt(1,-1);
        g << a-suma << '\n';

    }
    return 0;
}