Cod sursa(job #2166371)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 13 martie 2018 16:49:17
Problema Frac Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
# include <fstream>
# define DIM 320000
using namespace std;
ifstream fin("frac.in");
ofstream fout("frac.out");
long long f[DIM],d[DIM/10],val[(1<<16)],v[16],b[16],n,m,k,nr,i,j,step,cnt,x,q,Nr,p,r,NR;
long long numar(long long m){
    long long nr=0;
    for(int i=1;i<=Nr;i++)
        nr+=m/val[i];
    return nr;
}
int main () {
    fin>>n>>NR;
    for(i=2;i*i<=DIM-5;i++)
        if(f[i]==0){
            d[++k]=i;
            for(j=2*i;j<=DIM-5;j+=i)
                f[j]=1;
        }
    for(;i<=DIM-5;i++)
        if(f[i]==0)
            d[++k]=i;
    x=n;
    for(i=1;i<=k&&d[i]*d[i]<=n&&x!=1;i++){
        cnt=0;
        while(x%d[i]==0){
            x/=d[i];
            cnt++;
        }
        if(cnt)
            v[++q]=d[i];
    }
    if(x!=1)
        d[++q]=x;
    while(b[0]==0){
        j=q;
        while(b[j]){
            b[j]=0;
            j--;
        }
        nr=0;
        p=1;
        b[j]=1;
        for(i=1;i<=q;i++)
            if(b[i]){
                p*=v[i];
                nr++;
            }
        if(nr%2==0)
            val[++Nr]=p;
        else
            val[++Nr]=-p;
    }
    for(j=0,step=(1LL<<61);step;step/=2)
        if(numar(j+step)<NR)
            j+=step;
    fout<<j+1<<"\n";
    return 0;
}