Cod sursa(job #1764468)

Utilizator AlexDontuAlex Dontu AlexDontu Data 25 septembrie 2016 16:09:51
Problema Frac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <iostream>
#include<fstream>
#include<bitset>
#include<climits>
#define ll long long
using namespace std;
ifstream f ("frac.in");
ofstream g ("frac.out");
long long pr[100],d[1025],nr,nrd,n,p,i,k,v[100],sum,desc,px,u,m;
bitset<105> used;
inline void precalcprimes()
{
    if(n%2==0)
    {
        nr=1;
        pr[nr]=2;
        while(n%2==0) n/=2;
    }
    i=3;
    while(n!=1)
    {
        if(n%i==0)
        {
            while(n%i==0) n/=i;
            nr++;
            pr[nr]=i;
        }
        i+=2;
    }
}
void bk(ll x,ll prod)
{
    if(x>k)
    {
     nrd++;
     d[nrd]=prod;
     if(k%2==0) d[nrd]*=-1;
    }
    else
    {
        for(int i=v[x-1]+1;i<=nr;i++)
        {
            if(!used[i])
            {
                used[i]=1;
                v[x]=i;
                bk(x+1,prod*pr[v[x]]);
                used[i]=0;
            }
        }
    }
}
ll num(ll x)
{
    sum=0;
    for(i=1;i<=nrd;i++) sum+=x/d[i];
    return (x-(sum));
}
int main()
{
    ifstream f("frac.in");
    ofstream g("frac.out");
    f>>n>>px;
    precalcprimes();
    for(k=1;k<=nr;k++)
    {
        bk(1,1);
    }
    p=0;u=LLONG_MAX;
    while(u-p>1)
    {
        m=p+(u-p)/2;
        if(num(m)<px) p=m;
        else u=m;
    }
    g<<u;
    return 0;
}