Cod sursa(job #1125496)

Utilizator rughibemBelcineanu Alexandru Ioan rughibem Data 26 februarie 2014 17:58:58
Problema GFact Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include<stdio.h>
#include<math.h>
FILE *f=fopen("gfact.in","r"), *g=fopen("gfact.out","w");

struct descompunere{
    long int b, e;
} v[30];

long int P, Q, Hv=0;

void CitDesc(){
long int i, Prad, Pin;

    fscanf(f,"%ld %ld\n",&P,&Q); Pin=P;
    Prad= sqrt(P);

    for(i=2;i<=Prad;i++){

        if( P%i==0 ){
            v[++Hv].b=i;
            while(P%i==0) { v[Hv].e++; P/=i; }
        }

    }
    if(P>1){ Hv++; v[Hv].b=P; v[Hv].e=1; } P=Pin;

    for(i=1;i<=Hv;i++)
          v[i].e *= Q;
}

bool verif( long long int nr ){
long long int t, j;
long int i;

    for(i=1;i<=Hv;i++){

        t=0;
        j= v[i].b;

        while( j<=nr ){ t+= (nr/j); j*=v[i].b; }

        if( t< (1LL * v[i].e) ) return 0;

    }
    return 1;
}

void CautBinar(){
long long int p, u, mij;

    p= 1LL * v[Hv].b; u= 1LL * P * Q;

    while( p<=u ){
        mij= (p+u)/2;
        if( verif(mij) ) u = mij-1;
        else p = mij+1;
    }
    fprintf(g,"%lld\n",p);

}

int main(){

    CitDesc();
    CautBinar();

return 0;
}