Pagini recente » Cod sursa (job #757591) | Cod sursa (job #2325847) | Cod sursa (job #1146226) | Cod sursa (job #2381641) | Cod sursa (job #2382387)
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int dp[20], e[20], q, ndp;
void desc( int n ){
int d = 2;
while ( d * d <= n ){
if ( n % d == 0 ){
dp[ndp] = d;
while ( n % d == 0 ){
e[ndp] ++;
n /= d;
}
ndp ++;
}
d ++;
}
if ( n > 1 ){
dp[ndp] = n;
e[ndp] = 1;
ndp ++;
}
}
long long putere_fact ( long long n, int d ){
long long nr = 0;
while ( n >= d ){
nr += n / d;
n /= d;
}
return nr;
}
bool se_divide ( long long n ){
int i;
for ( i = 0 ; i < ndp; i ++ ){
if ( putere_fact( n, dp[i] ) < e[i] * q ){
return false;
}
}
return true;
}
int main(){
FILE *fin, *fout;
fin = fopen( "gfact.in", "r" );
fout = fopen( "gfact.out", "w" );
int p;
fscanf( fin, "%d%d", &p, &q );
desc(p);
long long r = 0, pas = 1ll << 35;
while ( pas > 0 ){
if ( !se_divide( r + pas ) ){
r += pas;
}
pas /= 2;
}
fprintf( fout, "%lld", r + 1 );
fclose( fin );
fclose( fout );
return 0;
}