Cod sursa(job #521210)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 11 ianuarie 2011 18:32:55
Problema Frac Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include <stdio.h>

long long n,m,p,v[20],d,div,s;

void back(int a,long long prod,int ok)
{
    if (a==d+1)
    {
        if (prod==1) return;
        s+=ok*(div/prod);
        return;
    }
    back(a+1,prod*v[a],-ok);
    back(a+1,prod,ok);
}

int main()
{
    long long i,step,add,r;
    freopen("frac.in","r",stdin);
    freopen("frac.out","w",stdout);
    scanf("%I64d%I64d",&n,&p);
    m=n;
    for (i=2;i*i<=m;++i)
    {
        if (!(m%i))
        {
            ++d;
            v[d]=i;
            m/=i;
            while (!(m%i)) m/=i;
        }
    }
    if (m!=1)
    {
        ++d;
        v[d]=m;
    }
    div=n;r=n;
    back(1,1,-1);
    add=(p/(n-s))*n;
    p%=s;
    for (step=1;step<=r;step<<=1);
    for (i=1;step;step>>=1)
    {
        s=0;div=i+step;
        back(1,1,-1);
        if (i+step<=r&&(n-s)==p) i+=step;
    }
    printf("%I64d",i+add);
    return 0;
}