Pagini recente » Cod sursa (job #574217) | Cod sursa (job #2954617) | Cod sursa (job #1065340) | Cod sursa (job #573136) | Cod sursa (job #2278072)
#include <bits/stdc++.h>
using namespace std;
const int nmax=110000;
long long cmmdc(long long a,long long b)
{
long long r=a%b;
do
{
r=a%b;
a=b;
b=r;
}
while(b);
return a;
}
bool ciur[nmax];
int prime[nmax];
int divprime[nmax];
void eciur()
{
ciur[0]=1;
ciur[1]=1;
for(int i=4;i<=nmax;i+=2)
ciur[i]=1;
for(int i=3;i*i<=nmax;i+=2)
if(ciur[i]==0)
{
for(int j=3;i*j<=nmax;j+=2)
ciur[i*j]=1;
}
}
void eprime()
{
prime[0]=1;
prime[1]=2;
for(int i=3;i<=nmax;i+=2)
{
if(ciur[i]==0)
{
prime[0]++;
prime[prime[0]]=i;
}
}
}
int main()
{
ifstream cin("frac.in");
ofstream cout("frac.out");
long long nr,p,n;
cin>>n>>p;
eciur();
eprime();
nr=n;
for(int i=1;i<=prime[0];i++)
{
if(prime[i]>n/2)
break;
if(n%prime[i]==0)
{
nr*=(prime[i]-1);
nr/=prime[i];
}
}
if(nr==n)
{
int k=p/n;
cout<<p+k+k/p;
return 0;
}
int exp=p/nr;
if(p%nr==0)
exp--;
p%=nr;
if(p==0)
p=nr;
int xz=0;
for(int i=1;i<=n;i++)
{
if(cmmdc(i,n)==1)
xz++;
if(xz==p)
{
cout<<i+n*exp;
return 0;
}
}
return 0;
}