Cod sursa(job #198158)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 8 iulie 2008 22:29:40
Problema Frac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <stdio.h>
#include <string.h>

#define NMAX 20

long long n,k,nr,v[NMAX],vec[NMAX],i,m,q,stanga,dreapta1,numar,dreapta2;

long long ver(long long x)
{
long long suma=0,i;
memset(vec,0,sizeof(vec));
    while(vec[0]==0)
	{
	for(i=nr;i>=0;i--)
	    if(vec[i]==0)
	    {
	    vec[i]=1;
	    break;
	    }
	    else vec[i]=0;
long long produs=1,t=0;
	for(i=nr;i>=1;i--)
	    if(vec[i])
	    {
	    produs*=v[i];
	    t=!t;
	    }
	if(produs==1) break;
	if(t==0) suma-=x/produs;
	    else suma+=x/produs;
        }   
return x-suma;
}





long long cautare(long long a,long long b)
{
long long m;
if(a==b) return a;
    m=(a+b)/2;
    if(ver(m)>=k)
    return cautare(a,m);
    else
    return cautare(m+1,b);
}

void citire()
{
freopen("frac.in","rt",stdin);
freopen("frac.out","wt",stdout);

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

void descompunere()
{   
long long i;
    for(i=2;i*i<=n;i++)   
        if(n%i==0)   
            {   
            v[++nr]=i;   
            while(n%i==0) n/=i;   
	    }
    if(n!=0) v[++nr]=n;   
}


void solve()
{
citire();
descompunere();
stanga=0;
dreapta1=1000000000;
printf("%lld",cautare(stanga,dreapta1*dreapta1));
}

int main()
{
solve();
return 0;
}