Pagini recente » Cod sursa (job #2062809) | Cod sursa (job #1049134) | Cod sursa (job #1145241) | Cod sursa (job #1037406) | Cod sursa (job #1745406)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("frac.in");
ofstream g("frac.out");
const int PMAX = 1000000;
int nrp, Prim[PMAX / 2], nrd;
long long divp[13];
bool v[PMAX];
long long cmmdc(long long a, long long b)
{
long long r;
while(b)
{
r = a % b;
a = b;
b = r;
}
return a;
}
void ciur()
{
int i, j;
for(i = 4; i < PMAX; i += 2)
v[i] = 1;
for(i = 3; i * i < PMAX; i += 2)
if(v[i] == 0)
for(j = i * i; j < PMAX; j += i)
v[j] = 1;
nrp = 1;
Prim[1] = 2;
for(i = 3; i < PMAX; i += 2)
if(v[i] == 0)Prim[++nrp] = i;
}
void divizorip(long long x)
{
nrd = 0;
for(int i = 1; 1LL * Prim[i]*Prim[i] <= x; i++)
if(x % Prim[i] == 0)
{
divp[++nrd] = Prim[i];
do
{
x /= Prim[i];
}
while(x % Prim[i] == 0);
}
if(x > 1) divp[++nrd] = x;
}
int main()
{
long long N, P;
f >> N >> P;
ciur();
divizorip(N);
int nt = 1 << nrd;
long long card = 0;
for(int i = 1; i < nt; i++)
{
long long prod = 1;
int ndiv = 0;
int p2;
for(int j = 0; (p2 = 1 << j) <= i; j++)
if(p2 & i)
{
ndiv++;
prod *= divp[j + 1];
}
long long t = N / prod;
if(ndiv % 2 == 0)card -= t;
else card += t;
}
int nr = N - card;
int c = P / nr;
int r = P % nr;
if(r==1)
g<<c*N+1;
else
{
int p=1;
for(int i=2; i<N; i++)
{
if(cmmdc(i,N)==1)
p++;
if(p==r)
{
g<<c*N+i;
break;
}
}
}
return 0;
}