Cod sursa(job #265262)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 23 februarie 2009 18:10:35
Problema Frac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 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("%lld%lld", &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=0;
    r=1LL * (long long)(1<<30) * (long long)(1<<30) * 2;
    while(l+1<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)
        {
            sol=m;
        }
        if(s>=p)
        {
            r=m;
        }
        else
        {
            l=m;
        }
    }
    printf("%lld\n", sol);
    return 0;
}