Cod sursa(job #2140420)

Utilizator topala.andreiTopala Andrei topala.andrei Data 23 februarie 2018 14:38:02
Problema Mins Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("mins.in");
ofstream g("mins.out");
const int rad_max_d = 1000;
int C,D;
int divi[20],fprim[1000], ans;

bool prim[rad_max_d];

void prime()
{
    int i, j;

    for (i = 2; i < rad_max_d; i++)
        prim[i] = 1;
    for (i = 2; i < rad_max_d; i++)
        if (prim[i])
        {
            for (j = 2*i; j < rad_max_d; j += i)
                prim[j] = 0;

            fprim[++fprim[0]] = i;
        }

}
int pinex(int x)
{

    int k=0, nrdiv=0, i, j;
    while (x > 1)
    {
        k++;
        if (x % fprim[k] == 0)
            divi[++nrdiv] = fprim[k];

        while (x % fprim[k] == 0)
            x/=fprim[k];

        if (fprim[k] * fprim[k]  > x && x>1 )
        {
            divi[++nrdiv] = x;
            x=1;
        }
    }

    int K=(1 << nrdiv);

    long long sol=C-1, prod;
    int nr,p;


    for (i=1;i < K; i++)
    {
        prod = 1;
        nr=0;
        for (j=0; j<nrdiv; j++)
        {
            if (i & (1<<j))
            {
                prod = 1LL * prod * divi[j+1];
                nr++;
            }
        }
        if (nr % 2 != 0) p=-1;
        else p=1;

        sol += 1LL * p * (C-1) / prod;
    }
    return sol;


}
int main()
{
    f>>C>>D;
    prime();
    if (C<D) swap(C,D);

    for (int i=1;i<D;i++)
        ans+=pinex(i);

    g<<ans;

    return 0;
}