Pagini recente » Cod sursa (job #2371019) | Cod sursa (job #1269989) | Cod sursa (job #1521092) | Cod sursa (job #2000985) | Cod sursa (job #2278079)
#include <fstream>
#include <bitset>
using namespace std;
ifstream in("frac.in");
ofstream out("frac.out");
long long p, phiN, ans, ans2, n, copN;
bitset<336870520> v;
bool ok = true;
long long phi(long long k)
{
if(k == 1)
return 1;
for(long long d = 2; d*d <= k; d++)
if(k % d == 0)
{
long long p = 0;
long long put = 1;
while(k % d == 0)
{
k /= d;
p++;
put *= d;
}
if(p == 1)
return phi(k) * (d-1);
else
return phi(k * put / d) * d;
}
return k-1;
}
int main()
{
in >> n >> p;
phiN = phi(n);
ans = (p-1) / phiN;
p = (p-1) % phiN + 1;
ans *= n;
copN = n;
for(long long d = 2; d*d <= copN; d++)
{
if(copN % d == 0)
{
while(copN % d == 0)
copN /= d;
v[d] = 1;
}
}
if(copN != 1)
v[copN] = 1;
if(p > phiN / 2)
{
p = phiN - p;
ok = false;
}
ans2 = 1;
p--;
for(long long i = 2; i <= n/2 && p; i++)
{
if(v[i] == 1)
for(long long j = i+i; j <= n/2; j += i)
v[j] = 1;
else
{
ans2 = i;
p--;
}
}
if(!ok)
ans2 = n - ans2;
out << ans + ans2;
return 0;
}