Cod sursa(job #2278079)

Utilizator mircearoataMircea Roata Palade mircearoata Data 7 noiembrie 2018 11:33:47
Problema Frac Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <fstream>
#include <bitset>

using namespace std;

ifstream in("frac.in");
ofstream out("frac.out");

long long p, phiN, ans, ans2, n, copN;

bitset<336870520> v;

bool ok = true;

long long phi(long long k)
{
    if(k == 1)
        return 1;
    for(long long d = 2; d*d <= k; d++)
        if(k % d == 0)
        {
            long long p = 0;
            long long put = 1;
            while(k % d == 0)
            {
                k /= d;
                p++;
                put *= d;
            }
            if(p == 1)
                return phi(k) * (d-1);
            else
                return phi(k * put / d) * d;
        }
    return k-1;
}

int main()
{
    in >> n >> p;
    phiN = phi(n);
    ans = (p-1) / phiN;
    p = (p-1) % phiN + 1;
    ans *= n;
    copN = n;
    for(long long d = 2; d*d <= copN; d++)
    {
        if(copN % d == 0)
        {
            while(copN % d == 0)
                copN /= d;
            v[d] = 1;
        }
    }
    if(copN != 1)
        v[copN] = 1;
    if(p > phiN / 2)
    {
        p = phiN - p;
        ok = false;
    }
    ans2 = 1;
    p--;
    for(long long i = 2; i <= n/2 && p; i++)
    {
        if(v[i] == 1)
            for(long long j = i+i; j <= n/2; j += i)
                v[j] = 1;
        else
        {
            ans2 = i;
            p--;
        }
    }
    if(!ok)
        ans2 = n - ans2;
    out << ans + ans2;
    return 0;
}