Cod sursa(job #1810763)

Utilizator rares1012Rares Cautis rares1012 Data 20 noiembrie 2016 15:39:41
Problema GFact Scor 75
Compilator c Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <stdio.h>
#include <stdlib.h>
#define Pr 4675

int p[Pr];
char c[45000];
int fact[Pr+1][2];

void prime()
{
    int i,k=0;
    for(i=2;i<45000;i++)
        if(c[i]==0){
            p[k]=i;
            k++;
        }
}

void ciur()
{
    int i,d,s=0;
    for(i=2; i*i<45000; i++)
        if(c[i]==0){
            for(d=i*i; d<45000; d+=i)
                c[d]=1;
        }
    prime();
}

unsigned long long int nr(unsigned long long int n,int q)
{
    unsigned long long int s=0;
    while(n>0)
    {
        n=n/q;
        s+=n;
    }
    return s;
}

char verif(unsigned long long int n,int q)
{
    int i=1,x=1;
    while(i<=q && x==1)
    {
        if(nr(n,fact[i][0])<fact[i][1])
            x=0;
        i++;
    }
    return x;
}

int main()
{
    int n,k,d,q;
    unsigned long long int step=1,r;
    FILE*fi,*fo;
    fi=fopen("gfact.in","r");
    fo=fopen("gfact.out","w");
    fscanf(fi,"%d%d",&n,&k);
    ciur();
    d=0;
    q=0;
    while(n>1){
        if(n%p[d]==0)
        {
            if(fact[q][0]!=p[d]){
                fact[q][1]*=k;
                q++;
            }
            n=n/p[d];
            fact[q][0]=p[d];
            fact[q][1]++;
        }
        else {
            d++;
        }
    }
    fact[q][1]*=k;
    step=step<<63;
    r=0;
    while(step>0)
    {
        if(verif(r+step,q)==0)
            r+=step;
        step/=2;
    }
    fprintf(fo,"%d",r+1);
    fclose(fi);
    fclose(fo);
    return 0;
}