Cod sursa(job #1591386)

Utilizator preda.andreiPreda Andrei preda.andrei Data 6 februarie 2016 10:48:46
Problema GFact Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <iostream>
#include <cstdio>
#include <vector>

using namespace std;

int factori[1001];
int puteri[1001];
int lung;

void desparteInFactori(int n);
bool valid(long long int val, int modPutere);
bool prim(int n);

int main()
{
    FILE *fin = fopen("gfact.in", "r");
    FILE *fout = fopen("gfact.out", "w");

    long long int pas, poz;
    int p, q;

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

    desparteInFactori(p);

//    for(int i=1; i<=lung; ++i)
//        fprintf(fout, "%d^%d\n", factori[i], puteri[i]);

    pas = 1LL << 31;
    poz = 0;
    while(pas > 0){
        if(poz + pas <= 2000000000 && !valid(poz + pas, q))
            poz += pas;
        pas >>= 1;
    }

    fprintf(fout, "%lld", poz + 1);
    return 0;
}

bool valid(long long int val, int modPutere){
    long long int put, div, cval;
    for(int i=1; i<=lung; ++i){
        div = factori[i];
        put = 1LL * puteri[i] * modPutere;
        cval = val;

        while(cval > 0 && put > 0){
            put -= (cval / div);
            cval /= div;
        }

        if(put > 0)
            return false;
    }
    return true;
}

void desparteInFactori(int n){
    for(int i=2; i*i<=n; ++i){
        if(n % i == 0){
            factori[++lung] = i;
            while(n % i == 0){
                n /= i;
                puteri[lung]++;
            }
        }
    }
    if(n > 1){
        factori[++lung] = n;
        puteri[lung] = 1;
    }
}

bool prim(int n){
    if(n <= 1)
        return false;
    for(int i=2; i*i<=n; ++i)
        if(n % i == 0)
            return false;
    return true;
}