Cod sursa(job #3226536)

Utilizator Andrei_RusuAndrei Alexandru Rusu Andrei_Rusu Data 21 aprilie 2024 19:42:50
Problema GFact Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("gfact.in");
ofstream fout("gfact.out");
const int NMAX=1000;
int p, q, k;
struct FACTORI
{
    int d, e;
}v[NMAX+5];
long long fast_expo(int b, int expo)
{
    long long a=b, p=1;
    for(;expo;expo>>=1)
    {
        if(expo&1) p*=a;
        a*=a;
    }
    return p;
}
long long legendre(long long n, int d)
{
    long long numitor=d, s=0;
    while(numitor<=n)
    {
        s+=n/numitor;
        numitor*=d;
    }
    return s;
}
long long cautare_binare(int d, int e)
{
    long long st=1, dr=d*q*e, med, last=0;
    while(st<=dr)
    {
        med=(st+dr)/2;
        if(legendre(med,d)>=q)
        {
            last=med;
            dr=med-1;
        }
        else
            st=med+1;
    }
    return last;
}
void max_fact_prim()
{
    int n=p, d=2, e;
    k=0;
    while(d*d<=n)
    {
        e=0;
        while(n%d==0)
        {
            e++;
            n/=d;
        }
        if(e)
        {
            v[++k].d=d;
            v[k].e=e;
        }
        d++;
    }
    if(n>1)
    {
        v[++k].d=n;
        v[k].e=1;
    }
}
int main()
{
    int i;
    long long maxb=0;
    fin >> p >> q;
    max_fact_prim();
    for(i=1; i<=k; ++i)
    {
        long long aux=cautare_binare(v[i].d,v[i].e);
        if(maxb<aux)
            maxb=aux;
    }
    fout << maxb;
    return 0;
}