Cod sursa(job #1592054)

Utilizator Vlad_317Vlad Panait Vlad_317 Data 6 februarie 2016 23:35:01
Problema GFact Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <stdio.h>

using namespace std;

int d[1000], e[1000], n = 0;

bool verif(int x, int j)
{
    int pow = d[j];
    int nr = 0;
    while(x/pow)
    {
        nr += x / pow;
        pow *= d[j];
    }
    if(nr < e[j])
        return false;
    return true;
}

long long cb(int j)
{
    long long i = 1, pas = 1 << 20;
    while(pas)
    {
        if(i + pas <= (unsigned long long)e[j] * d[j] && verif(i + pas, j) == false)
            i += pas;
        pas >>= 1;
    }
    return i + 1;
}

int main()
{
    FILE *fin, *fout;

    fin = fopen("gfact.in", "r");
    fout = fopen("gfact.out", "w");

    int p, q;

    fscanf(fin, "%d%d", &p, &q);

    int i = 2;

    while(p != 1 && i * i <= p)
    {
        int x = i, y = 0;
        while(p % i == 0)
        {
            p /= i;
            y++;
        }
        if(y)
        {
            n++;
            d[n] = x;
            e[n] = y * q;
        }
        i++;
    }

    if(p)
    {
        n++;
        d[n] = p;
        e[n] = q;
    }

    long long max = 0;

    for(int i = 1; i <= n; i++)
    {
        int val = cb(i);
        if(val > max)
            max = val;
    }

    fprintf(fout, "%lld", max);

    return 0;
}