Pagini recente » Cod sursa (job #3206939) | Cod sursa (job #1268666) | Cod sursa (job #1358960) | Cod sursa (job #1459123) | Cod sursa (job #2290994)
#include <iostream>
#include <fstream>
using namespace std;
long long n,N,i,i0,j=0,k,Euler,m,p,q,u[12],pas;
long long catecopr(long long x)
{
long long lim=1LL<<j, a=0;
for(i=0;i<lim;i++)
{
long long b=0,pp=1;
for(i0=0;i0<j;i0++)
{
if(i & (1LL << i0))
{
b++; pp*=u[i0];
}
}
if(b%2==0) a=a+x/pp;
else a=a-x/pp;
}
return a;
}
int cautbin()
{
int a;
while(1)
{
a=catecopr(k);
if(a==p)
{
while(p==catecopr(k-1)) k--;
return k;
}
if(a>p) k=k-pas/2;
if(a<p) k=k+pas/2;
pas=pas/2;
}
}
int main()
{
ifstream fin("frac.in"); ofstream fout("frac.out");
cin>>n>>m;
Euler=n;k=n;N=n;
for(i=2;n>1;i++) {if((n/i)*i==n) {while((n/i)*i==n) n=n/i; u[j]=i;j++;}}
for(i=0;i<j;i++) Euler=(Euler/u[i])*(u[i]-1);
p=m%Euler; q=m/Euler; pas=k;
i=cautbin();
cout<<q*N+i;
return 0;
}