Cod sursa(job #112616)

Utilizator devilkindSavin Tiberiu devilkind Data 6 decembrie 2007 10:25:10
Problema Frac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <stdio.h>
#define NMAX 20

long long n,k,st,dr,nr,mid,div[NMAX],x,i,j;

void back(long long nivel, long long nr1, long long p)
{
if (p>mid) return;
if (nivel==div[0]+1)
                {
                if (nr1==0) return;
                if (nr1%2==0) x-=mid/p;
                        else x+=mid/p;
                return;
                }
back(nivel+1,nr1,p);
back(nivel+1,nr1+1,p*div[nivel]);
}

int main()
{

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

        scanf("%lld %lld",&n,&k);

        st=1; dr= (long long)1<<61;

        for (i=2;i*i<=n;i++)
                {
                if (n%i) continue;
                div[ ++div[0] ] = i;

                for (;n%i==0;n/=i);
                }

        if (n>1) div[ ++div[0] ]=n;
        

        while (st<dr-1)
                {
                mid=(st+dr)/2;

                x=0;
                nr=mid;

                back(1,0,1);
                nr-=x;

                if (nr<k) st=mid;
                        else dr=mid;
                }
        nr=st;
        back(1,0,1);
        nr-=x;

        if (nr==k) printf("%lld",st);
                else printf("%lld",dr);
        
        return 0;
}