Cod sursa(job #998055)

Utilizator Detrol2kGuianu Leon Detrol2k Data 15 septembrie 2013 16:48:36
Problema GFact Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <fstream>
#include <algorithm>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <vector>
#include <queue>
using namespace std;

//////////// GLOBALS ////////////
vector<int> base, exponent;

/////////// FUNCTIONS ///////////
inline void compute_prime_factors(int n) {
    for(int i = 2; i * i <= n; i++) {
        if(n % i == 0) {
            base.push_back(i);
            int e = 0;
            while(n % i == 0) {
                n /= i;
                e++;
            }
            exponent.push_back(e);
        }
    }

    if(n > 1) {
        base.push_back(n);
        exponent.push_back(1);
    }
}

long long find_exponent(int val, int b) {
    long long res = 0;

    while(val / b > 0 ) {
        res += val / b;
        val /= b;
    }

    return res;
}

long long find_min_factor(int b, int e) {
    long long value = 1;

    while(find_exponent(value, b) < e)
        value *= 2;
    value /= 2;
    long long result = value;
    while(value) {
        if(find_exponent(value + result, b) < e)
            result += value;
        value /= 2;
    }

    return result + 1;
}

///////////// MAIN /////////////
int main() {
	ifstream fin("gfact.in");
	ofstream fout("gfact.out");

    int p, q;

	// Read
    fin >> p >> q;


	// Compute
    compute_prime_factors(p);

    long long solution = 0;
    for(int i = 0; i < base.size(); i++)
        solution = max(solution, find_min_factor(base.at(i), exponent.at(i) * q));



	// Print
	fout << solution;
}