Cod sursa(job #614983)

Utilizator andra23Laura Draghici andra23 Data 8 octombrie 2011 11:49:28
Problema GFact Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include<fstream>
#include<vector>
#include<cmath>
#include<iostream>

using namespace std;

vector < pair <int,int> > divx;
ofstream g("gfact.out");

void calculateDiv(long long p, int q) {
	int sqr = sqrt(p), nr;
	for (int i = 2; i <= sqr && p > 1; i++) {
		nr = 0;
		while (p % i == 0) {
			nr++;
			p = p/i;
		}
		if (nr > 0) {
			divx.push_back(make_pair(i, nr*q));
		}
	}
	if (divx.size() == 0) {
		divx.push_back(make_pair(p, q));
	}
}

int testSolution(long long x) {
	int cod = 1;
	long long aux, d, p, paux;
	for (int i = 0; i < divx.size(); i++) {
		d = divx[i].first;
		p = divx[i].second;
		aux = x;
		paux = 0;
		while (aux > 0 && paux < p) {
			paux += aux/d;
			aux = aux/d;
		}
		if (paux < p) {
			cod = 0;
			break;
		}
	}
	return cod;
}

long long bsearch(long long left, long long right) {
	long long m, result;
	while (left <= right) {
		m = (left+right)/2;
		if (testSolution(m)) {
			result = m;
			right = m-1;
		} else {
			left = m+1;
		}
	}
	return result;
}

int main() {
	ifstream f("gfact.in");

	int p, q;
	f >> p >> q;
	long long r = (long long) p * q;

	calculateDiv(p, q);
	
	long long result = bsearch(1, r);

	g << result << '\n';

	return 0;
}