Cod sursa(job #1981250)

Utilizator AnaRaduAna-Maria Radu AnaRadu Data 15 mai 2017 11:40:15
Problema Frac Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <stdio.h>
#define lim 10000000
bool ciur[lim+5];
int v[lim/3],d[lim/3];
void ciuruire(){
    int i,j;
    for(i=2;i*i<lim;i++)
        if(ciur[i]==false)
            for(j=i*i;j<lim;j+=i)
                ciur[j]=true;
    ciur[0]=true;
    ciur[1]=true;
    for(i=2;i<=lim;i++)
        if(ciur[i]==false){
            v[0]++;
            v[v[0]]=i;
        }
}
long long cate(long a, long long b){
    long long i,j,c,nrd,nr,s,val;
    c=b;
    nrd=0;
    for(i=1;i<=v[0]&&v[i]*v[i]<=b;i++)
        if(b%v[i]==0){
            d[nrd]=v[i];
            nrd++;
            while(c%v[i]==0)
                c=c/v[i];
        }
    if(c!=1){
        d[nrd]=c;
        nrd++;
    }
    s=0;
    for(i=0;i<(1<<nrd);i++){
        val=1;
        nr=0;
        for(j=0;j<nrd;j++)
            if(i&(1<<j)){
                val=val*(long long)d[j];
                nr++;
            }
        if(nr%2==0)
            s+=a/val;
        else
            s-=a/val;
    }
    return s;
}
int main(){
    FILE *fin,*fout;
    fin=fopen("pinex.in","r");
    fout=fopen("pinex.out","w");
    long long a,b,st,dr,pp=0,n,rasp=0;
    ciuruire();
    fscanf(fin,"%lld%lld",&b,&n);
    st=1;
    dr=1000000000000000000;
    while(st<=dr&&pp==0){
        a=(st+dr)/2;
        if(cate(a,b)==n){
            pp=1;
            rasp=a;
        }
        if(cate(a,b)<n)
            st=a+1;
        if(cate(a,b)>n)
            dr=a-1;
    }
    fprintf(fout,"%lld",rasp);
    fclose(fin);
    fclose(fout);
    return 0;
}