Cod sursa(job #164154)

Utilizator raula_sanChis Raoul raula_san Data 23 martie 2008 16:50:46
Problema Frac Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <cstdio>

#define maxS 109545

long long N, P;
long long F[maxS];

void Fact()
{
    long long f = 2;
    long long n = N;

    while(n != 1)
    {
        int ok = 0;
        while(!(n % f))
        {
            n /= f;
            ok = 1;
        }
        if(ok) F[++F[0]] = f;

        ++ f;
    }
}

long long Cmmdc(long long x, long long y)
{
    long long r;

    while(y)
    {
        r = x % y;
        x = y;
        y = r;
    }

    return x;
}

double Euler(long long x)
{
    double r = (double) x;

    int i;
    for(i=1; i<=F[0]; ++i)
        r -= (double) (r / F[i]);

    long long y = (long long) (r * 10);
    r = y / 10;
    y %= 10;
    r += (double) (0.1 * (double) y);

    return r;
}

int main()
{
    freopen("frac.in", "rt", stdin);
    freopen("frac.out", "wt", stdout);

    scanf("%lld %lld", &N, &P);
    Fact();

    long long st = 0, dr = (long long) 1 << 61, m;
    double p = P;

    while(st <= dr)
    {
        m = (st + dr) >> 1;

        double r = Euler(m);

        if(r == p)
        {
            while(Cmmdc(m, N) != 1) -- m;

            printf("%lld", m);
            break;
        }
        else
        {
            if(r < P) st = m;
            if(r > P) dr = m;
        }
    }

    fclose(stdin);
    fclose(stdout);

    return 0;
}