Cod sursa(job #1275122)

Utilizator VictorDumitrescuDumitrescu Victor VictorDumitrescu Data 24 noiembrie 2014 19:59:43
Problema GFact Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <stdio.h>

using namespace std;
FILE *f,*g;

int div[20], pow[20], nd, p, q;

void desc()
{
    int i = 2;
    while (i*i <= p)
    {
        if (p%i == 0)
        {
            nd++;
            div[nd] = i;
            while (p%i == 0)
            {
                pow[nd]++;
                p /= i;
            }
        }
        i++;
    }
    if (p != 1)
    {
        nd++;
        div[nd] = p;
        pow[nd] = 1;
    }
}

long long putere(long long x, int k)
{
    //calculeaza puterea maxima la care pot sa-l ridic pe k a.i. sa-l divida pe x!
    long long rez = 0;
    while(x >= k)
    {
        rez += x / k;
        x /= k;
    }
    return rez;
}

//1*2*3*4*5*6*7*8*9*10*11 -> 11/2 + 5/2 + 2/2 = 5 + 2 + 1 = 8

bool divide(long long x)//verifica daca p^q il divide pe x!
{
    for (int i = 1; i <= nd; i++)
        if (putere(x, div[i]) < pow[i]*q)
            return false;
    return true;
}

long long cb()
{
    long long pas = 1LL << 50;
    long long i=0;
    while(pas>0){
        if(!divide(i + pas))
            i+=pas;
        pas=pas >> 1;
    }
    return 1 + i;
}

int main()
{
    f=fopen("gfact.in","r");
    g=fopen("gfact.out","w");
    fscanf(f,"%d%d",&p,&q);
    desc();
    fprintf(g,"%lld",cb());
    fclose(f);
    fclose(g);
    return 0;
}