Pagini recente » Cod sursa (job #1292829) | Cod sursa (job #1946850) | Istoria paginii runda/eusebiu_oji_2018_cls11-12/clasament | Cod sursa (job #588712) | Cod sursa (job #1591366)
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
vector<int> factori;
vector<int> puteri;
void desparteInFactori(int n);
bool valid(long long int val, int modPutere);
int main()
{
FILE *fin = fopen("gfact.in", "r");
FILE *fout = fopen("gfact.out", "w");
long long int pas, poz;
int p, q;
fscanf(fin, "%d%d", &p, &q);
desparteInFactori(p);
// for(int i=0; i<factori.size(); ++i)
// cout << factori[i] << "^" << puteri[i] << "\n";
pas = 1LL << 60;
poz = 0;
while(pas > 0){
if(poz + pas <= 2000000000 && !valid(poz + pas, q))
poz += pas;
pas >>= 1;
}
fprintf(fout, "%lld", poz + 1);
return 0;
}
bool valid(long long int val, int modPutere){
long long int put, div, cval;
for(int i=0; i<factori.size(); ++i){
div = factori[i];
put = 1LL * puteri[i] * modPutere;
cval = val;
while(cval > 0 && put > 0){
put -= (cval / div);
cval /= div;
}
if(put > 0)
return false;
}
return true;
}
void desparteInFactori(int n){
int d, put;
d = 2;
while(n != 1){
put = 0;
while(n % d == 0){
n /= d;
put++;
}
if(put > 0){
factori.push_back(d);
puteri.push_back(put);
}
d++;
}
}