Cod sursa(job #1622968)

Utilizator Coroian_DavidCoroian David Coroian_David Data 1 martie 2016 16:14:59
Problema GFact Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <iostream>
#include <cstdio>
using namespace std;
FILE *f,*g;
long long p,q,i,mx,cexp,nd;
long long exp[10001],d[10001];
bool ok;
long long putere(long long n,long long d)
{
    long long p=0;
    while(n>=d)
        p+=n/d,n/=d;
    return p;
}
bool divizibil(long long n)
{
    for (int i = 1; i <= nd; i++)
        if (putere(n, d[i]) < exp[i] * q)
            return false;
    return true;
}

int main()
{
    f=fopen("gfact.in","r");
    g=fopen("gfact.out","w");
    fscanf(f,"%lld%lld",&p,&q);
    long long n=p;
    long long d1 = 2;
    while (d1 * d1 <= n)
    {
        if (n % d1 == 0)
        {
            p = 0;
            while (n % d1 == 0)
            {
                p++;
                n /= d1;
            }
            d[++nd]=d1;
            exp[nd]=i;
        }
        d1++;
    }
    if (n != 1)
        exp[++nd]=1,d[nd]=n;
 /*   for(i=1;i<=c;i++)
        fprintf(g,"%d\n",exp[i]);*/
    //caut binar cel mai mare i cu proprietatea ca i! nu e divizibil cu p la q
    i = 0;
    long long pas = 1LL << 60;
    while (pas != 0)
    {
        if (!divizibil(i + pas))
            i += pas;
        pas /= 2;
    }
    /*i=mx;
    cexp=1;
    int c=0;
    if(exp[mx]>1)
    {
        while(ok==0)
        {
            i+=mx;
            if(i%mx==0)
            {
                c=i;
                while(c%mx==0)
                {
                    c/=mx;
                    cexp++;
                }
                if(cexp>=exp[mx])
                {
                    ok=1;
                    break;
                }
            }
        }
    }*/
    fprintf(g,"%lld",1 + i);
    fclose(f);
    fclose(g);
    return 0;
}