Cod sursa(job #907855)

Utilizator lianaliana tucar liana Data 8 martie 2013 13:39:49
Problema Frac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<stdio.h>
#define ndmax 25
#define nelmax 3000
long long d, n, p, nd, nel, i, nr, val, nrnumdc, nrnumfdc, st, dr, mjc, k, doi=2, rezmax;
long long v[nelmax], smn[nelmax], div[ndmax];

void descomp()
{
    d=2;
    while (d*d<=n)
    {
        p=0;
        while(n%d==0)
        {   n/=d;   p++;    }
        if (p>0)
            div[++nd]=d;
        d++;
    }
    if (n>1)
        div[++nd]=n;
}

void gen(long poz)
{
    if (poz==nd+1)
    {
        if (val>1)
        {
            v[++nel]=val;
            if (nr%2==0)
              smn[nel]=-1;
            else
              smn[nel]=1;
        }
    }
    else
    {
        gen(poz+1);
        val=val*div[poz];  nr++;
        gen(poz+1);
        val=val/div[poz];  nr--;
    }
}

void verificare()
{
    nrnumdc=0;
    for (i=1;i<=nel;i++)
        nrnumdc+=(mjc/v[i])*smn[i];
    nrnumfdc=mjc-nrnumdc;
}

void rezolvare()
{
    st=1;   dr=rezmax;
    while (st<=dr)
    {
        mjc=(st+dr)/2;
        verificare();
        if (nrnumfdc>=k)
            dr=mjc-1;
        else
            st=mjc+1;
    }
    printf("%lld\n",st);
}
int main()
{
    freopen("frac.in","r",stdin);
    freopen("frac.out","w",stdout);
    rezmax=1;
    for (i=1;i<=61;i++)
        rezmax=rezmax*doi;
    scanf("%lld %lld",&n,&k);
    descomp();
    val=1;    gen(1);
    rezolvare();
    return 0;
}