Cod sursa(job #819591)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 19 noiembrie 2012 13:12:26
Problema Frac Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <stdio.h>
#include <string.h>
#include <math.h>
#define ll long long
#define MAX_P1 20000000

ll x ,y,fact[1000];

ll fprim[1000];

bool prim[MAX_P1];

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

    prim[2]=0;

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

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

            for (ll j=i*i;j<=1000000;j+=2*i)
                prim[j]=1;
        }
		
	for (ll i = 2 ; i <=1000000 ; ++ i)
		if (prim [ i ] == 0 )
			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 (ll i=1;i<(1<<t);++i)
    {
        ll nr=0,prod=1;
        for (ll 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=(ll)1<<62,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();

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

    return 0;
}