Cod sursa(job #949775)

Utilizator mitrutstrutMitrea Andrei Ionut mitrutstrut Data 14 mai 2013 21:55:36
Problema Frac Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <stdio.h>
#include <string.h>
#include <math.h>
#define ll long long
#define MAX_P1 1000000
 
ll x ,y,fact[10000];
 
ll fprim[10000];
 
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<(1LL<<t);++i)
    {
        ll nr=0,prod=1;
        for (ll j=0;j<t;++j)
            if ((1LL<<j)&i)
            {
 
                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,last=0;
    while (st<=dr)
    {
        med=st+(dr-st)/2;
        if (pinex( med , x ) == y)
            last=med;
        if (pinex( med , x ) < y)
            st=med+1;
        else
            dr=med-1;
    }
    return last;
}
 
int main()
{
 
    freopen("frac.in","r",stdin);
    freopen("frac.out","w",stdout);
 
    scanf("%lld %lld",&x,&y);
 
    ciur();
 
    printf("%lld",cb());
 
    return 0;
}