Cod sursa(job #2093524)

Utilizator shantih1Alex S Hill shantih1 Data 23 decembrie 2017 22:11:49
Problema GFact Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <iostream>
#include <fstream>
#define ll long long

using namespace std;
ifstream fin("gfact.in");
ofstream fout("gfact.out");

ll n, i, j, nr, p, q, d, dv[4700], nd, pt, st, dr, mid, B;
bool ciur[45000];

ll fact (ll p, ll f)
{
	ll po=p, rez=0;
	while (po <= f)
	{
		rez += f/po;
		po *= p;
	}
	return rez;
}

int main () {
	
	for (i = 2; i <= 45000; i++)
		if (ciur[i] == 0)
		{
			nd++;	dv[nd] = i;
			for (j = 2; i*j <= 45000; j++)	ciur[i*j]=1;
		}
	
	fin >> p >> q;
	d = 1;
	while (p != 1 && d <= nd)
	{
		pt = 0;
		while (p%dv[d] == 0)
		{
			pt++;
			p /= dv[d];
		}
		if (pt != 0)
		{
			st = 1;	dr = pt*q;
			while (st <= dr)
			{
				mid = st+(dr-st)/2;
				nr = fact(dv[d], mid*dv[d]);
				if (nr >= pt*q)	dr = mid-1;
				if (nr < pt*q)	nr = mid+1;
				if (nr == pt*q)	st = dr+1;
			}
			if (fact(dv[d], (mid-1)*dv[d]) == pt*q)		mid--;
			if (fact(dv[d], mid*dv[d])   < pt*q)		mid++;
			if (mid*dv[d] > B)	B = mid*dv[d];
		}
		d++;
	}
	if (p > 1)
	{
		st = 1;	dr = q;
		while (st <= dr)
		{
			mid = st+(dr-st)/2;
			nr = fact(p, mid*p);
			if (nr >= q)	dr = mid-1;
			if (nr < q)		st = mid+1;
			if (nr == q) 	st = dr+1;
		}
		if (fact(p, (mid-1)*p) == q)	mid--;
		if (fact(p, (mid-1)*p) < p)		mid++;
		if (mid*p > B)	B = mid*p;
	}
	fout << B << "\n";
}