Cod sursa(job #1728135)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 12 iulie 2016 12:28:46
Problema Frac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include<cstdio>
#define MAXD 30
#define INF (1LL<<61)
using namespace std;
long long dividers=0;
long long value[MAXD];
long long Count(long long x){
    long long limit=(1<<dividers),i,j,answer=x,add;
    for(i=1;i<limit;i++){
        add=1;
        for(j=0;j<dividers;j++)
            if((i&(1<<j)))
                add*=-value[j];
        answer+=x/add;
    }
    return answer;
}
int main(){
    freopen("frac.in","r",stdin);
    freopen("frac.out","w",stdout);
    long long n,k,temp,i,left=1,right=INF,middle,answer;
    scanf("%lld%lld",&n,&k);
    temp=n;
    for(i=2;i*i<=n;i++)
        if(n%i==0){
            value[dividers]=i;
            dividers++;
            while(n%i==0)
                n/=i;
        }
    if(n!=1){
        value[dividers]=n;
        dividers++;
    }
    n=temp;
    while(left<=right){
        middle=(left+right)/2;
        if(Count(middle)>=k){
            answer=middle;
            right=middle-1;
        }
        else
            left=middle+1;
    }
    printf("%lld",answer);
    return 0;
}