Cod sursa(job #480391)

Utilizator marius.bucurBucur Marius - Ovidiu marius.bucur Data 27 august 2010 16:34:28
Problema GFact Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<fstream>
#include<cmath>
#include<vector>
using namespace std;

typedef std::vector<std::pair<long long int, long long int> > divisor;

int P,Q;
divisor* D;
long long int R;

divisor* get_divisor(long long int P, long long int Q) {
	divisor* result = new divisor;
	long long int i = 2;
	while(P != 1) {
		if(P % i == 0) {
			long long int k = 0;
			while(P % i == 0) {
				k++;
				P /= i;
			}
			std::pair<long long int, long long int> apair;
			apair.first = i;
			apair.second = k * Q;
			result->push_back(apair);
		}
		if(i > sqrt(P)) {
			if(P == 1)
				break;
			std::pair<long long int, long long int> apair;
                        apair.first = P;
                        apair.second = Q;
                        result->push_back(apair);
			break;
		}
		if(i != 2)
			i += 2;
		else
			i++;
	}
	return result;
}

int get_apear(long long int N, long long int p) {
	long long int i = 0;
	while(N > 0) {
		i += N / p;
		N /= p;
	}
	return i;
}

int get_nr(long long int N) {
	for(std::vector<std::pair<long long int, long long int> >::iterator it = D->begin(); it != D->end(); it++) {
		std::pair<long long int, long long int> apair = *it;
		int count = get_apear(N, it->first);
		if(count < it->second) {
			return 1;
		}
	}
	return 0;
	
}

long long int final_result(long long int mijloc) {
	if(get_nr(mijloc) != 0) {
		mijloc++;
		while(get_nr(mijloc) != 0) {
			mijloc++;
		}
		return mijloc;
	}
	while(get_nr(mijloc) == 0) {
		mijloc--;
	}
	return mijloc + 1;
}

void b_search(long long int left, long long int right) {
	long long int mijloc = 2;
	while(left < right) {
		mijloc = (left + right) / 2;
		long long int result = get_nr(mijloc);
		if(result > 0) {
			left = mijloc + 1;
		}
		else {
			right = mijloc;
		}
	}
	R = final_result(mijloc);
}

void solve() {
	D = get_divisor(P, Q);
	b_search(1, (long long int)P * Q);
}

int main() {
	ifstream in("gfact.in");
	ofstream out("gfact.out");
	in >> P >> Q;
	solve();
	out << R;
	in.close();
	out.close();
}