Cod sursa(job #2164861)

Utilizator Claudiu07Pana Claudiu Claudiu07 Data 13 martie 2018 10:08:44
Problema Frac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("frac.in");
ofstream g("frac.out");
int M, nr, x[50], k,poz;
long long N,P,rez,divs[50],m,sol;
int pr[80000];
bool v[1000005];
void ciur(long long n)
{
    int i, j;
    v[0]=1;
    v[1]=1;
    for(i=4; i<=n; i+=2)
        v[i] = 1;
    for(i=3; i*i<=n; i+=2)
    {
        if(v[i]==0)
            for(j=i*i; j<=n; j+=i)
                v[j]=1;
    }
    pr[1]=2;
    nr=1;
    for(int i=3; i<=n; i+=2)
        if(v[i]==0)
            pr[++nr]=i;
}
void add(int n, long long A)
{
    int s=1;
    long long p=1;
    for(int i=1; i<=n; i++)
        if(x[i]==1)
        {
            s*=-1;
            p*=divs[i];
        }
    rez+=s*A/p;
}
void backt(int n)
{
    k=1;
    x[1]=-1;
    while(k>0)
        if(x[k]<1)
        {
            x[k]++;
            if(k==n)
                add(n,m);
            else
            {
                k++;
                x[k]=-1;
            }
        }
        else
            k--;
}
void cb()
{
    long long p=1,u=1LL<<61;
    while(p<=u)
    {
        rez=0;
        m=(p+u)/2;
        backt(poz);
        if(rez<P) p=m+1;
        else
        {
            sol=m;
            u=m-1;
        }
    }
    g<<sol;
}
void solt()
{

    for(int crt=1; crt<=nr && 1LL*pr[crt]*pr[crt]<=N; crt++)
        if(N%pr[crt]==0)
        {
            divs[++poz]=pr[crt];
            do
            {
                N/= pr[crt];
            }
            while(N%pr[crt]==0);
        }
    if(N>1)
    {
        divs[++poz]=N;
    }
    rez=0;
    cb();
}
int main()
{
    f>>N>>P;
    ciur(1000005);
    solt();
    return 0;
}