Cod sursa(job #2671166)

Utilizator teodorescunicolasteodorescu nicolas alexandru teodorescunicolas Data 11 noiembrie 2020 16:39:33
Problema GFact Scor 90
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <stdio.h>
#define MAXX 46000

char ciur[MAXX + 1];
int nrprime[MAXX];

int cautbin( int div, int exp ) {
    long long st, dr, mij, elem;
    int exp2;
    st = 0;
    dr = (long long)exp * div;
    while ( dr - st > 1 ) {
        exp2 = 0;
        mij = ( dr + st ) / 2;
        elem = div;
        while ( elem <= mij ) {
            exp2 += mij / elem;
            elem *= div;
        }
        if ( exp2 < exp ) {
            st = mij;
        } else {
            dr = mij;
        }
    }
    return dr;
}

long long descp( int n, int put ) {
    int i = 0, exp;
    long long rasp, x = 1;
    while ( n > 1 && nrprime[i] * nrprime[i] <= n ) {
        exp = 0;
        while ( n % nrprime[i] == 0 ) {
            n /= nrprime[i];
            exp++;
        }
        exp *= put;
        if ( exp > 0 ) {
            rasp = cautbin( nrprime[i], exp );
            if ( rasp > x ) {
                x = rasp;
            }
        }
        i++;
    }
    if ( n > 1 ) {
        rasp = cautbin( n, put );
        if ( rasp > x )
            x = rasp;
    }
    return x;
}

int main()
{
    FILE *fin, *fout;
    int p, q, i, nr, j;
    fin = fopen( "gfact.in", "r" );
    fout = fopen( "gfact.out", "w" );
    fscanf( fin, "%d%d", &p, &q );
    nr = 0;
    for ( i = 2; i <= MAXX; i++ ) {
        if ( ciur[i] == 0 ) {
            nrprime[nr] = i;
            nr++;
            for ( j = i * i; j <= MAXX; j += i ) {
                ciur[j] = 1;
            }
        }
    }
    fprintf( fout, "%lld", descp( p, q ) );
    fclose( fin );
    fclose( fout );
    return 0;
}