Cod sursa(job #1748771)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 26 august 2016 19:57:10
Problema Frac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include <iostream>
#include <cstdio>

using namespace std;

long long n, p;
long long fact[50];
int nq;

void prepare()
{
    for (long long d = 2; d * d <= n; d++)
	{
        if (n % d == 0)
			fact[nq++] = d;
        while (n % d == 0) n /= d;
	}
	if (n != 1)
		fact[nq++] = n;
}

long long numara(long long cine)
{
    int bt = 1, fin = (1<<nq);
    long long rez = 0;
    for (; bt < fin; bt++) {
		int flip = 0;
		long long nr = 1;
        for (int i = 0; i < nq; i++)
            if (bt & (1<<i)) {
                flip++;
				nr *= fact[i];
            }
		if (flip & 1)
			rez += (cine/nr);
		else
			rez -= (cine/nr);
    }
	return cine - rez;
}

void solve()
{
    long long val = 1, step = 1LL<<61;
    for ( ; step; step >>= 1) {
        long long valide = numara(val+step);
        if (valide < p)
			val += step;
    }
    printf("%lld", val+1);
}

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

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

    return 0;
}