Cod sursa(job #129681)

Utilizator damaDamaschin Mihai dama Data 29 ianuarie 2008 21:14:52
Problema Frac Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <stdio.h>

long long n, p, ans, div[32], min, mid, max, sol, nr, s = 1;

void bkt(int k);

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

    int i;
    long long temp;

    scanf("%lld %lld", &n, &p);

    temp = n;
    for(i = 2; i * i <= n; ++i)
    {
        if(temp % i == 0)
        {
            div[++div[0]] = i;
        }
        while(temp % i == 0)
            temp /= i;
    }
    if(temp != 1)
    {
        div[++div[0]] = temp;
    }
    min = 0;
    max = (long long) 2000000000 * 2000000000;

    while(min <= max)
    {
        sol = 0;
        mid = (min + max) / 2;
        bkt(1);
        //printf("%lld %lld\n", mid, sol);
        if(sol < p)
        {
            min = mid + 1;
        }
        else if(sol == p)
        {
            ans = mid;
            max = mid - 1;
        }
        else
        {
            max = mid - 1;
        }
    }

    printf("%lld\n", ans);

    return 0;
}

void bkt(int k)
{
    if(k == div[0] + 1)
    {
        if(nr % 2 == 0)
        {
            sol += mid / s;
        }
        else
        {
            sol -= mid / s;
        }
    }
    else
    {
        bkt(k + 1);
        ++nr;
        s *= div[k];
        bkt(k + 1);
        --nr;
        s /= div[k];
    }
}