Cod sursa(job #2382426)

Utilizator Mihai.MocanuMihai mmm Mihai.Mocanu Data 18 martie 2019 12:05:25
Problema GFact Scor 100
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

int dp[30], e[30], 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 = -1, pas = 1ll << 45;
    while ( pas > 0 ){
        if ( !se_divide( r + pas ) ){
            r += pas;
        }
        pas /= 2;
    }
    fprintf( fout, "%lld", r + 1 );
    fclose( fin );
    fclose( fout );
    return 0;
}