Pagini recente » Cod sursa (job #328144) | Cod sursa (job #2220848) | Cod sursa (job #665622) | Cod sursa (job #754408) | Cod sursa (job #60568)
Cod sursa(job #60568)
#include<stdio.h>
#include<math.h>
int d[100],nd;
long long f(long long x)
{
//divizorii primi
long long i,sol=0,backup=x;
nd=0;
if(x%2==0)
{
d[++nd]=2;
while(x%2==0)
x>>=1;
}
for(i=3;i<=(long long)sqrt((double)x);i+=2)
if(x%i == 0)
{
d[++nd]=i;
while(x%i==0)
x/=i;
}
if(x!=1)
d[++nd]=x;
int conf,diviz,n1;
for(conf=1;conf< (1<<nd);conf++)
{
diviz=1;
n1=0;
for(i=0;i<nd;i++)
if( ((1<<i) & conf) )
{
diviz*=d[i+1];
n1++;
}
if(n1%2)
sol+=backup/diviz;
else
sol-=backup/diviz;
}
return backup-sol;
}
int main()
{
FILE *fin=fopen("frac.in","r"),
*fout=fopen("frac.out","w");
long long N,P;
fscanf(fin,"%lld %lld",&N,&P);
long long li,lf,mij,sol;
li=1;lf=((long long)1<<50);
while(lf-li>1)
{
mij=(li+lf)>>1;
sol=f(mij);
if(sol<P)
li=mij;
else
lf=mij;
}
if(f(li)==P)
fprintf(fout,"%lld\n",li);
else
fprintf(fout,"%lld\n",lf);
fclose(fin);
fclose(fout);
return 0;
}