Cod sursa(job #1909289)

Utilizator Moldovan1234andrei Moldovan1234 Data 7 martie 2017 12:11:24
Problema GFact Scor 65
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <cstdio>
#include <bitset>
using namespace std;
int le(int x , int k)
{
    int tot=0,prod=k;
    while(prod<=x)
    {
        tot+=x/prod;
        prod*=k;
    }
    return tot;
}
bitset<20005>a;
int v[10],exp[10];
int pr1[10],pr2[10];
int main()
{
    freopen("gfact.in","r",stdin);
    freopen("gfact.out","w",stdout);
    int i ,j;
    a[0]=a[1]=1;
    for(i=4;i<=20000;i+=2)a[i]=1;
    for(i=3;i * i <=20000;i+=2)
        if(!a[i])
        for(j=i*i;j<=20000;j+=2*i)a[j]=1;
    int max=0,e=0,q,n,cnt=0;
    scanf("%d%d",&n,&q);
    while(n>1&&n%2==0)
    {
        e++;
        n/=2;
    }
    if(e)
        {
          v[++cnt]=2;
          exp[cnt]=e*q;
        }
    for(i=3;i<=20000;i+=2)
    {
        if(i*i>n)break;
        if(!a[i])
        {
            int nr=i;
            e=0;
            while(n>1&&n%nr==0)
            {
                e++;
                n/=nr;
            }
            if(e)
            {
                v[++cnt]=nr;
                exp[cnt]=e*q;
            }
        }
    }
    if(n>1)
    {
        v[++cnt]=n;
        exp[cnt]=q;
    }
    int st=1,dr=2000000000;
    if(q==1)
    {
        max=v[cnt];
            while(st<dr)
    {
        int mij=(dr-st)/2+st;
        int x=le(mij,max);
        if(x<exp[cnt])st=mij+1;
        if(x>exp[cnt])dr=mij-1;
        if(x==exp[cnt])
            dr=mij;
    }
        printf("%d",st);
        return 0;
    }
    for(i=1;i<=cnt;i++)
    {
        max=v[i];st=1;
        dr=2000000000;
        while(st<dr)
    {
        int mij=(dr-st)/2+st;
        int x=le(mij,max);
        if(x<exp[i])st=mij+1;
        if(x>exp[i])dr=mij-1;
        if(x==exp[i])
            dr=mij;
    }
    pr1[i]=st;
    }
    max=0;
    for(i=1;i<=cnt;i++)if(pr1[i]>max)max=pr1[i];
    printf("%d",max);
    return 0;
}