Pagini recente » Cod sursa (job #577275) | Cod sursa (job #614265) | Cod sursa (job #1076260) | Cod sursa (job #2718616) | Cod sursa (job #2672126)
#include <stdio.h>
int v[10][2];///e posibil sa nu fie asta numearul maxim de divizorii primi, dar nu recunosc nimic
long long leg( int k, long long a ) {
long long exp, pow;
exp = 0;
pow = k;
while( pow <= a ) {
exp += a / pow;
pow *= k;
}
return exp;
}
int main() {
FILE *fin, *fout;
fin = fopen( "gfact.in", "r" );
fout = fopen( "gfact.out", "w" );
int k, n, q, p, ok, l, i, e;
long long st, dr, mij, cp;
fscanf( fin, "%d", &n );
cp = n;
fscanf( fin, "%d", &q );
p = 2;
k = -1;
while (p * p <= n) {
e = 0;
while (n % p == 0) {
n = n / p;
++e;
}
if (e > 0) {
k++;
v[k][0] = p;
v[k][1] = e * q;
}
++p;
}
if (n > 1){
k++;
v[k][0] = n;
v[k][1] = q;
}
st = v[k][0] - 1;
dr = cp * q + 1;
while( dr - st > 1 ) {
mij = ( dr - st ) / 2 + st;
ok = 1;
for( i = 0; i <= k; i++ ) {
if( leg( v[i][0], mij ) < v[i][1] )
ok = 0;
}
if( ok ) {
dr = mij;
l = mij;
} else {
st = mij;
}
}
fprintf( fout, "%d", l );
return 0;
}