Cod sursa(job #1252498)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 30 octombrie 2014 20:20:53
Problema GFact Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <stdio.h>
#define INF 8000000000000000000LL
#define MAXK 9
int e[MAXK], p[MAXK], k;
inline void desc(int n){
    int d;
    k=0;
    d=2;
    while(1LL*d*d<=n){
        if(n%d==0){
            p[k]=d;
            while(n%d==0){
                n/=d;
                e[k]++;
            }
            k++;
        }
        d++;
    }
    if(n!=1){
        p[k]=n;
        e[k]=1;
        k++;
    }
}
inline long long legendre(long long n, int d){
    long long s, x;
    s=0;
    x=d;
    while(x<=n){
        s+=n/x;
        x*=1LL*d;
    }
    return s;
}
inline long long exp(long long n){
    int i;
    long long min, x;
    min=INF;
    for(i=0; i<k; i++){
        x=legendre(n, p[i])/e[i];
        if(x<min){
            min=x;
        }
    }
    return min;
}
int main(){
    long long rez, pas;
    int q, n;
    FILE *fin, *fout;
    fin=fopen("gfact.in", "r");
    fout=fopen("gfact.out", "w");
    fscanf(fin, "%d%d", &n, &q);
    desc(n);
    rez=0;
    pas=1<<30;
    for(pas=pas<<15; pas!=0; pas>>=1){
        if(exp(rez+pas)<q){
            rez+=pas;
        }
    }
    fprintf(fout, "%lld\n", rez+1LL);
    fclose(fin);
    fclose(fout);
    return 0;
}