Cod sursa(job #812135)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 13 noiembrie 2012 15:41:52
Problema Frac Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <stdio.h>
#include<string.h>
#include <math.h>
#define ll long long
#define MAX_P1 10000000

ll x ,y,fact[30];

ll fprim[20000007];

bool prim[MAX_P1];

void ciur(ll MAX_P)
{
    prim[1]=1;

    prim[2]=0;

    for (ll i=4;i<=MAX_P;i+=2)
        prim[i]=1;

    fprim[++fprim[0]]=2;

    for (ll i=3;i<=sqrt(MAX_P)*2;i+=2)
        if (prim[i]==0)
        {

            for (ll j=i*2;j<=MAX_P;j+=i)
                prim[j]=1;

            fprim[++fprim[0]]=i;

        }
}

ll pinex(ll A,ll B)
{

    ll t=0,d=0;

    while (B>1)
    {

		d++;

        if (B%fprim[d]==0)
        {

            fact[++t]=fprim[d];

            while (B%fprim[d]==0)
                B/=fprim[d];

        }

        if (fprim[d]>sqrt(B)&&B>1)
        {

            fact[++t]=B;

            B=1;

        }

    }

    ll sol=A;
    for (int i=1;i<(1<<t);i++)
    {

        ll nr=0,prod=1;

        for (int j=0;j<t;j++)
            if ((1<<j)&i)
            {

                prod=1LL*prod*fact[j+1];

                nr++;

            }

        if (nr%2)
            nr=-1;
        else
            nr=1;

        sol+=1LL*nr*A/prod;
    }

    return sol;

}

ll cb()
{

    ll st=1,dr=100,med=0;

    while (st<=dr)
    {

        med=st+(dr-st)/2;

        if (pinex(med,x)<y)
            st=med+1;
        else
            dr=med-1;

    }

    return med;

}

int main()
{

    freopen("frac.in","r",stdin);
    freopen("frac.out","w",stdout);

    scanf("%lld %lld",&x,&y);

    ciur(y);

    printf("%lld",cb());

    return 0;
}