Cod sursa(job #976968)

Utilizator Athena99Anghel Anca Athena99 Data 24 iulie 2013 14:39:41
Problema Frac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
#include <cassert>
#include <cstdio>

long long v[25];

int main()
{
    long long n=0,k=0,q=0,i=2,j=0,b=1,e=1,m=0,aux=0,x=0,a1=1,a2=1;

    assert(freopen("frac.in","r",stdin));
    assert(freopen("frac.out","w",stdout));

    assert(scanf("%lld%lld",&n,&k));
    while (i*i<=n)
    {
        if (n%i==0)
            v[++q]=i;
        while (n%i==0)
            n/=i;
        ++i;
    }
    if (n>1)
        v[++q]=n;

    e=(long long)1<<61;
    while (b<=e)
    {
        m=(b+e)/2;
        aux=m;

        for (i=1; i<(long long)1<<q; ++i)
        {
            x=1;
            for (j=0; j<=q; ++j)
            {
                if (i&((long long)1<<j))
                    x*=-v[j+1];
                a2*=2;
            }
            m+=aux/x;
        }

        if (m>=k)
            e=aux-1;
        else
            b=aux+1;
    }

    printf("%lld\n",b);

    return 0;
}