Cod sursa(job #391014)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 4 februarie 2010 22:04:44
Problema Frac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include<stdio.h>
#define LL long long

const LL N=1050,M=(LL)1<<61;

LL n,p,pr[N],nr,poz,u[N];

bool b[N];

void prec()
{
	for( LL i=2 ; i*i<=n ; ++i )
		if( n%i==0 )
		{
			while(n%i==0)
				n/=i;
			pr[++nr]=i;
		}
	if(n!=1)
		pr[++nr]=n;
}

void read()
{
	scanf("%lld%lld",&n,&p);
	prec();
}

void ad( int uso )
{
	LL a=1;
	if(uso==0)
		return;
	for( int i=1 ; i<=nr ; ++i )
		if( b[i]==1 )
			a*=pr[i];
	if( uso%2==1 )
		a*=-1;
	u[++poz]=a;
}

void back( int x , int uso )
{
	if(x>nr)
	{
		ad(uso);
		return;
	}
	b[x]=0;
	back(x+1,uso);
	b[x]=1;
	back(x+1,uso+1);
}

LL check(LL x)
{
	LL rez=x;
	for( int i=1 ; i<=poz ; ++i )
		rez+=x/u[i];
	return rez;
}

LL caut()
{
	LL i,step = M;
	for( i=0 ; step ; step>>=1 )
		if( check(i+step)<p )
			i+=step;
	return i+1;
}

int main()
{
	freopen("frac.in","r",stdin);
	freopen("frac.out","w",stdout);
	read();
	back(1,0);
	printf("%lld",caut());
	return 0;
}