Cod sursa(job #492115)

Utilizator istymIstudor Mihai istym Data 13 octombrie 2010 15:02:47
Problema GFact Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>
using namespace std;

ifstream in("gfact.in");
ofstream out("gfact.out");

long long  D[10000][2];
long long B,P,i,Q,K,st,dr,fact,rez;
bool fnd;
int factori(long long X,long val)
{
    int rez = 0;
    while(X)
    {
        rez+=X/val;
        X/=val;
    }
    return rez ;
}
int main()
{
    in>>P>>Q;
    D[1][0] = 2;
    int t = 1;
    while(!(P&1))     D[1][1]+=Q,P>>=1;
    for(i=3;i*i<=P&&P!=1;i+=2)
    {
        if(P-(P/i)*i==0)
        {
            D[++t][0]=i;
            while(P-(P/i)*i==0)
            {
                D[t][1]+=Q;
                P/=i;
            }
        }

    }
    if(P!=1)
        D[++t][0] = P,D[t][1]=Q;
    for(i=1;i<=t;i++)
    {
        st = 1;
        dr = 2*D[i][1];
        fnd = false;
        B=D[i][0];
        while(st<=dr&&fnd==false)
        {
            K = (st+dr)/2;
            B = K*D[i][0];
            fact = factori(B,D[i][0]);
            if(fact<D[i][1])
                st = K+1;
            if(fact>D[i][1])
                dr = K-1;
            if(fact==D[i][1])
                fnd = true;
        }
        if(factori(B-D[i][0],D[i][0])==D[i][1])
        {
            B-=D[i][0];
            while(factori(B-D[i][0],D[i][0])==D[i][1])
            B-=D[i][0];
        }
        if(B>rez)
        rez = B;
    }
    out<<rez;
    return 0;
}