Cod sursa(job #2672237)

Utilizator ioana0211Ioana Popa ioana0211 Data 13 noiembrie 2020 15:41:10
Problema Principiul includerii si excluderii Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>
#include <iostream>

using namespace std;
ifstream fin ("pinex.in");
ofstream fout ("pinex.out");
const int VAL_MAX=1000000;
int m, a, b, prime[1000000], cnt_prime;
int ciur[VAL_MAX+5], div_primi_b[10000000], cnt_div_b;
void gen_prime ()
{
    prime[++cnt_prime]=2;
    for(int i=3; i<=VAL_MAX; i+=2)
    {
        if(!ciur[i])
        {
            prime[++cnt_prime]=i;
            for(int j=2*i; j<=VAL_MAX; j+=i)
                ciur[j]=1;
        }
    }
}
void find_div_primi_b ()
{
    for(int i=0; i<100000; i++)
        div_primi_b[i]=0;
    cnt_div_b=0;
    int cb=b, i=1;
    while(cb>1)
    {
        if(cb%prime[i]==0) div_primi_b[++cnt_div_b]=prime[i];
        while(cb%prime[i]==0)
            cb/=prime[i];
        i++;
    }
}

long long calcul_neprime_cu_b ()
{
    long long neprime_cu_b=0;
    long long lim=(1<<cnt_div_b);
    for(int i=1; i<lim; i++)
    {
        long long prod_div=1, cnt=0;
        for(int j=0; j<cnt_div_b; j++)
            if(i&(1<<j))
            {
                prod_div*=div_primi_b[j+1];
                cnt++;
            }
        long long val;
        if(prod_div)
            val=a/prod_div;
        if(cnt%2==0)
            val*=(-1);
        neprime_cu_b+=val;
    }
    return neprime_cu_b;
}
int main()
{
    fin>>m;
    gen_prime();
    for(int k=1; k<=m; k++)
    {
        fin>>a>>b;
        find_div_primi_b();
        /*for(int i=1; i<=cnt_div_b; i++)
            cout<<div_primi_b[i]<<" ";
        cout<<"\n";*/
        fout<<a-calcul_neprime_cu_b()<<"\n";
    }
    return 0;
}