Cod sursa(job #1804263)

Utilizator rares1012Rares Cautis rares1012 Data 12 noiembrie 2016 13:29:19
Problema GFact Scor 30
Compilator c Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <stdio.h>
#include <stdlib.h>

char v[45000][2];

inline long long int nrdiv(long long int n,long long int k)
{
    long long int s=0;
    while(n>0)
    {
        s+=n/k;
        n=n/k;
    }
    return s;
}

long long int desc(int n)
{
    int d=2,k=0;
    while(n>1)
    {
        if(n%d==0)
        {
            n=n/d;
            if(v[k][1]==0)
                v[k][0]=d;
            v[k][1]++;
        }
        else
        {
            d++;
            if(n%d==0 && v[k][1]!=0)
                k++;
        }
    }
    return k;
}

int main()
{
    long long int z,q,p=1,r=0,n,x,i;
    FILE*fi,*fo;
    fi=fopen("gfact.in","r");
    fo=fopen("gfact.out","w");
    fscanf(fi,"%lld%lld",&z,&q);
    n=desc(z);
    p=p<<30;
    while(p>0)
    {
        x=0;
        for(i=0; i<=n; i++)
        {
            if(nrdiv(r+p,v[i][0])>v[i][1]*q && nrdiv(r+(p/2),v[i][0])>v[i][1]*q)
            x=1;
        }
        if(x==0)
            r+=p;
        p/=2;
    }
    x=0;
    while(x==0)
        {
            r++;
            for(i=0;i<=n;i++)
                if(nrdiv(r,v[i][0])>=v[i][1]*q){
                    x=1;}
        }
    x=0;
    while(x==0)
    {
        r--;
        for(i=0; i<=n; i++)
        {
            if(nrdiv(r,v[i][0])<v[i][1]*q)
            x=1;
        }
    }
    r++;
    fprintf(fo,"%lld",r);
    fclose(fi);
    fclose(fo);
    return 0;
}