0
点赞
收藏
分享

微信扫一扫

GDUT寒假训练场4-Happy 2006

鱼板番茄 2022-02-18 阅读 64
算法c++

题目描述

参考思路

参考代码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;
}
举报

相关推荐

0 条评论