Cod sursa(job #320029)

Utilizator DraStiKDragos Oprica DraStiK Data 3 iunie 2009 11:15:02
Problema Frac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.84 kb
#include <stdio.h>
#define DIM 105
#define ll long long
ll div[DIM];
ll n,m,p,sol;
void diviz ()
{
	ll i;
	for (i=2; i*i<n; ++i)
		if (n%i==0)
		{
			div[++m]=i;
			for ( ; n%i==0; n/=i);
		}
	if (n!=1)
		div[++m]=n;
}
ll calc (ll val)
{
	ll i,j,nr,d,nrc=0;
	for (i=1; i<(1<<m); ++i) 
	{
		for (j=nr=0, d=1; j<m; ++j)
			if (i&(1<<j)) 
			{
				++nr;
				d*=div[j+1];
			}
		if (nr%2==1) 
			nrc+=val/d;
		else 
			nrc-=val/d;
	}
    return nrc;
}
void solve ()
{
	ll st,dr,mij,nr;
	for (st=1, dr=(1LL<<61); st<=dr; )
	{
		mij=(st+dr)/2;
		nr=mij-calc (mij);
		if (nr==p)
			sol=mij;
		if (nr<p)
			st=mij+1;
		else
			dr=mij-1;
	}
	printf ("%lld",sol);
}
int main ()
{
	freopen ("frac.in","r",stdin);
	freopen ("frac.out","w",stdout);
	scanf ("%lld%lld",&n,&p);
	diviz ();
	solve ();
	return 0;
}