Cod sursa(job #2859032)

Utilizator Theo14Ancuta Theodor Theo14 Data 28 februarie 2022 19:19:32
Problema Principiul includerii si excluderii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include<bits/stdc++.h>
#define MOD 1000000
#define int long long
using namespace std;

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

int ciur[MOD],k=0,d[502],ans,a,b;
vector<int>v;

void eratosthenes()
{
    int i,j;
    for(i=2; i*i<=MOD; i++)
    {
        if(ciur[i]==0)
        {
            for(j=i*i; j<=MOD; j+=i)
                ciur[j]=1;
        }
    }
    for(i=2; i<=MOD; i++)
    {
        if(ciur[i]==0)
            v.push_back(i);
    }
}

void generare(int nrb, int nrtot, int l)
{
    if(nrb<=k)
    {
        generare(nrb+1,nrtot+1,l*d[nrb]);
        generare(nrb+1,nrtot,l);
        return;
    }
    if(nrtot%2==1)
        ans-=a/l;
    else
        ans+=a/l;
}

void solve(int x, int y)
{
    ans=0;
    k=0;
    for(auto it:v)
    {
        if(y!=1)
        {
            if(y%it==0)
            {
                y/=it;
                k++;
                d[k]=it;
                while(y%it==0)
                    y/=it;
            }
            else
            {
                if(y<it*it)
                {
                    k++;
                    d[k]=y;
                    y=1;
                }
            }
        }
        else
            break;
    }
    generare(1,0,1);
    g<<ans<<'\n';
}

signed main()
{
    int t,l;
    f>>t;
    eratosthenes();
    for(l=1; l<=t; l++)
    {
        f>>a>>b;
        solve(a,b);
    }
    return 0;
}