Cod sursa(job #265259)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 23 februarie 2009 18:06:15
Problema Frac Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <stdio.h>

long long n, p, s, d, l, r, m, f, sol;
long i, nr, j, nrb;
long long dp[20];

int main()
{
    freopen("frac.in", "r", stdin);
    freopen("frac.out", "w", stdout);
    scanf("%I64d%I64d", &n, &p);
    p--;
    nr=0;
    d=1;
    while(n>1 && d*d<=n)
    {
        d++;
        if(n % d == 0)
        {
            nr++;
            dp[nr]=d;
            while(n % d == 0)
            {
                n/=d;
            }
        }
    }
    if(n>1)
    {
        nr++;
        dp[nr]=n;
    }
    l=1;
    r=1LL * (long long)(1<<30) * (long long)(1<<30) * 2;
    while(l<r)
    {
        m=(l+r)/2;
        s=m;
        for(i=1; i<(1<<nr); i++)
        {
            nrb=0;
            f=1;
            for(j=0; j<nr; j++)
            {
                if(i & (1<<j) )
                {
                    nrb++;
                    f*=dp[j+1];
                }
            }
            if(nrb % 2==0)
            {
                s+= (m / f);
            }
            else
            {
                s-= (m / f);
            }
        }
        if(s>p)
        {
            r=m-1;
        }
        else
        {
            l=m+1;
            sol=m;
        }
    }
    printf("%I64d\n", sol+1);
    return 0;
}