题目描述
参考思路
参考代码1
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int pri[1000000];
int gcd(int a, int b)
{
return b?gcd(b,a%b):a;
}
int main()
{
int m,k;
while (~scanf("%d%d",&m,&k))
{
int i,t;
t = 0;
for (i = 1; i <= m; i++)
{
if (gcd(m, i) == 1)
pri[t++] = i;
}
if (k % t)
printf("%d\n",k/t*m+pri[k%t-1]);
else
printf("%d\n",(k/t-1)*m+pri[t-1]);
}
return 0;
}
参考代码2
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 1000010;
bool prime[N];
int eluar(int n)
{
int m = n, ans = n;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
ans = ans / i * (i - 1);
while (n % i == 0) n /= i;
for (int j = 1; j * i <= m; j++) prime[j * i] = true;
}
}
if (n > 1) {
ans = ans / n * (n - 1);
for (int j = 1; j * n <= m; j++) prime[j * n] = true;
}
return ans;
}
int main() {
int m, k;
while (cin >> m >> k)
{
memset(prime, 0, sizeof prime);
int cnt = eluar(m);
int t = k / cnt;
if (k % cnt == 0) t--;//判断是否--
k -= cnt * t;//判断区间剩余数字
int sum = 0, i;
for (i = 1; i <= m; i++)
{
if (!prime[i]) sum++;
if (sum == k) break;
}
cout << t * m + i << endl;//i
}
return 0;
}