Cod sursa(job #1018556)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 29 octombrie 2013 18:58:13
Problema Frac Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <fstream>
#include <cmath>

#define maxrez 1LL*(1<<30)*(1<<30)*2+1
#define ll long long

using namespace std;

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

ll fac[100001],lo,hi,prod,mid,n,P,s;
bool v[1000001];
ll p[100001],t,f;

void erathostenes (int n)
{
    p[1] = 2;
    t=1;

    for (int i=3; i<=n; ++i)
    {
        if (!v[i])
            p[++t] = i;

        for (int j=i*i; j<=n; ++j)
        {
            v[j] = 1;
        }
    }
}

void decompose (ll n)
{
    for (int i=1; i<=t; ++i)
    {
        if (n%p[i] == 0)
        {
            fac[++f] = p[i];

            while (n%p[i]==0)
            {
                n /= p[i];
            }
        }
    }

    if (n!=1)
    {
        fac[++f] = n;
    }
}

void subsets (int k, int nr)
{
    for (int i=k; i<=f; ++i)
    {
        prod *= fac[i];
        subsets (i+1,nr+1);
        prod /= fac[i];
    }

    if (nr%2)
    {
        s += mid/prod;
    }
    else if (nr!=0)
    {
        s -= mid/prod;
    }
}

int main()
{
    fin>>n>>P;

    erathostenes (sqrt(n)+1);

    decompose (n);

    lo = -1, hi = maxrez;

    while (hi-lo > 1)
    {
        mid = (lo+hi)/2;

        prod = 1;
        s=0;
        subsets (1,0);

        if (mid <= s+P-1)
            lo = mid;
        else
            hi = mid;
    }

    fout<<hi;
}