Cod sursa(job #1853488)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 21 ianuarie 2017 20:21:50
Problema GFact Scor 65
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <fstream>

using namespace std;

ifstream fin ("gfact.in");
ofstream fout ("gfact.out");
int p,q,nr,d,e,k,i,j,st,dr,mid,v[1001],ex[1001],m,ap,b,ok;
int main (){

    fin>>p>>q;
    d = 2;
    nr = p;
    while (nr!=1 && d*d<=nr){
        e = 0;
        while (nr%d==0){
            nr/=d;
            e++;
        }
        if (e!=0){
            v[++k] = d;
            ex[k] = e*q;
        }
        d++;
    }
    if (nr != 1){
        v[++k] = nr;
        ex[k] = q;
    }


    st = 1;
    dr = 2000000000;
    while (st<=dr){
        if (st%2==1 && dr%2 == 1)
            m = (st+dr)/2+1;
        else
            m = (st+dr)/2;
        ok = 0;
        for (i=1;i<=k;i++){
            nr = v[i]; // al i-lea factor din descompunerea in factori primi
            ap = 0;
            while (nr<=m){
                ap += m/nr;// numaram de cate ori apar
                if (nr <= m/v[i]){
                    nr *= v[i];
                }
                else
                    break;
            }
            if (ap < ex[i]){
                ok = 1;
                break;
            }
        }
        if (ok == 0){
            dr = m-1;
        }
        else
            st = m+1;
        // il descompunem pe m in facori primi;
        /*nr = m;
        d = 2;
        while (nr != 0 && d*d<=nr){
            e = 0;
            while (nr % d ==0){
                nr/=d;
                e++;
            }
            if (e!=0){
                if (e > v[])
            }
            d++;
        }
        */
    }
    fout<<st;


   /* b = 1;
    for (i=1;i<=k;i++){
        // cautam binar
        st = 1;
        dr = v[i]*ex[i];
        while (st<=dr){
            m = (st+dr)/2;
            nr = m;
            ap = 0;
            while (nr%v[i]==0){
                nr/=v[i];
                ap++;
            }
            if (ap <= ex[i])
                st = m+1;
            else
                dr = m-1;
        }
        b *= st;
    }
    fout<<b;
*/
    return 0;
}