Cod sursa(job #2546027)

Utilizator GeorgeCalinPetruta George-Calin GeorgeCalin Data 13 februarie 2020 19:25:00
Problema Principiul includerii si excluderii Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>
using namespace std;

ifstream fin("pinex.in");
ofstream fout("pinex.out");
long long di[300000];
long long bdiv[300000];
int d[300000];
short int ex[1000004];
long long suma = 0,ct, a;
long long prod = 1;

void bkt(int l)
{
    if(l < ct + 1)
    {
        int start;
        if(l == 1)
            start = 1;
        else
            start = d[l - 1] + 1;
        for(short int i = start; i <= ct; i++)
        {
            d[l] = i;
            prod*=bdiv[d[l]];
            long long sign = 1;
            if(l%2 == 0)
                sign = -1;
            suma += (sign*(a/prod));
            bkt(l+1);
            prod/=bdiv[d[l]];
        }
    }
}

int main()
{
    int m;
    long long b;
    fin>>m;
    di[1] = 2;
    int cnt = 1;
    for(long long i = 3; i <= 1000002; i += 2)
    {
        if(ex[i] == 0)
        {
            di[++cnt] = i;
            for(long long  j = i*i; j <= 1000002; j+=i)
                ex[j] = 1;
        }
    }
    for(int j = m; j != 0; j--)
    {
        suma = 0;
        prod = 1;
        fin>>a>>b;
        ct = 0;
        for(int i = 1; di[i] * di[i] <= b;i++)
        {
            if(b%di[i]==0){
                bdiv[++ct] = di[i];
                d[ct] = 0;
                b/=di[i];
            }
            while(b%di[i]==0){
                b/=di[i];
            }
        }
        if(b!=1)
            bdiv[++ct]= b;
        d[ct] = 0;
        bkt(1);
        fout<<a-suma<<"\n";
    }
    return 0;
}