Cod sursa(job #1842988)

Utilizator Walrus21andrei Walrus21 Data 7 ianuarie 2017 22:03:38
Problema Frac Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <stdio.h>

using namespace std;

long long i, j, n, p, q, pr, l, r, mid, nr, pq[10][255], vp[10];

int main()
{
    freopen("frac.in", "r", stdin);
    freopen("frac.out", "w", stdout);
    scanf("%d%d", &n, &p);
    long long nn = n;
    for(i = 2; i*i <= n; i++)
        if(!(n % i))
        {
            vp[++vp[0]] = i;
            while(!(n % i)) n/=i;
        }
    if(n > 1) vp[++vp[0]] = n;
    for(i = 1; i < (1 << vp[0]); i++)
    {
        pr = 1;
        q = 0;
        for(j = 0; (1 << j) <= i; j++)
            if(i & (1 << j))
            {
                pr *= vp[j+1];
                q++;
            }
        pq[q][++pq[q][0]] = pr;
    }
    r = 1LL << 61;
    while(l < r)
    {
        mid = l + (r - l) / 2;
        nr = mid;
        for(i = 1; i <= vp[0]; i++)
            for(j = 1; j <= pq[i][0]; j++)
                if(i % 2)
                    nr -= mid / pq[i][j];
                else
                    nr += mid / pq[i][j];
        if(nr == p) r = mid;
        else if (nr < p) l = mid + 1;
        else r = mid - 1;
    }
    printf("%lld", r);
}