Cod sursa(job #211818)

Utilizator ilincaSorescu Ilinca ilinca Data 3 octombrie 2008 18:17:13
Problema Frac Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <stdio.h>

long long n, p, o, prim [35];


void fact (int n)
{
	int div=2;
	while (n > 1)
	{
		if (n%div == 0)
			prim [++prim [0]]=div;
		while (n % div == 0)
				n/=div;
		++div;
	}
	o=(1<<prim [0]);
}

void calcul (long long w, int &nrbiti, long long &prod)
{
	int i;
	nrbiti=0;
	prod=1;
	for (i=1; i<=prim [0]; ++i,w>>=1)
		if (w&1)
			{
				++nrbiti;
				prod*=prim [i];
			}
}

long long f(long long x)
{
	long long i, s=x, prod;
	int nrbiti;
	for (i=1; i<o; ++i)
	{
			calcul (i, nrbiti, prod);
			if (nrbiti & 1)//nrbiti impar
				s-=x/prod;
			else
				s+=x/prod;
	}
	return s;
}

long long caut (long long st, long long dr)
{
	long long mij;
	while (st < dr)
	{
		mij=(st+dr)>>1;
		if (f (mij) < p)
			st=mij+1;
		else
			dr=mij;
	}
	return st;
}

int main ()
{
	freopen ("frac.in", "r", stdin);
	freopen ("frac.out", "w", stdout);
	scanf ("%lld%lld", &n, &p);
	fact (n);
	printf ("%lld", caut (1, ((long long)1<<(long long)61)));
	return 0;
}