Cod sursa(job #2085116)

Utilizator nicolaefilatNicolae Filat nicolaefilat Data 9 decembrie 2017 18:37:28
Problema GFact Scor 65
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <iostream>
#include <fstream>
#include <vector>


using namespace std;

ifstream in("gfact.in");
ofstream out("gfact.out");


unsigned long long int p,q;

void cit(){
    in>>p>>q;
}
void afis(vector<pair<unsigned long long int,unsigned long long int> >perechi){
    for(pair<unsigned long long int,unsigned long long int> it : perechi)
        cerr<<it.first<<"^"<<it.second<<"\n";
}
void diviz(unsigned long long int p,vector<pair<unsigned long long int,unsigned long long int> >&perechi){
    unsigned long long int d = 2,cnt;
    while(d*d <= p){
        cnt = 0;
        if(p % d == 0){
            while(p % d == 0){
                p /= d;
                cnt++;
            }
            perechi.push_back(make_pair(d,cnt*q));
        }
        d++;
    }
    if(p != 1)
        perechi.push_back(make_pair(p,q));
}
bool validare(unsigned long long int x,vector<pair<unsigned long long int,unsigned long long int> > perechi_p){

    bool ok = false;

    for(pair<unsigned long long int,unsigned long long int>it : perechi_p){
        unsigned long long int a = it.first;
        int p = it.second;
        unsigned long long int cnt = 0;

        while(x >= a){
            cnt += x / a;
            a *= it.first;
        }
        if(p <= cnt)
            ok = true;
    }
    return ok;
}
void cautbin(){
    unsigned long long int pas = 1LL<<50,r = 0;

    vector<pair<unsigned long long int,unsigned long long int> >perechi_p;
    diviz(p,perechi_p);


    while(pas){
        if(validare(r+pas,perechi_p) == false)
            r += pas;
        pas /= 2;
    }
    r ++;
    out<<r;
}

int main()
{
    cit();
    cautbin();

    return 0;
}