Happy 2006 (欧拉函数 + 思维)

题目链接: Happy 2006

大致题意

给定n和k, 询问从1开始, 第k个与n互质的数是多少.

解题思路

首先, 设1~n中与n互质的数个数为num, 那么[n + 1, 2n]中与n互质的数的个数也一定为num.

因此我们只需要用欧拉函数求出num, 然后判断k在第几个区间即可.

关于数据范围, 其实最极端的情况就是, n = 2, k = 1E9的情况了, 这时候答案只有2E9的范围, 不会爆int.

AC代码

//头文件
#define rep(i, n) for (int i = 1; i <= (n); ++i)
#define debug(a) cout << #a << " = " << a << endl;
using namespace std;
typedef long long ll;
int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
//复杂度 O(√n) 本质: 分解质因数
int fact(int n) { //单个数的欧拉函数
    int res = n;
    for (int i = 2; i <= n / i; ++i) {
        if (n % i == 0) {
            res = res / i * (i - 1); //注意顺序, 防止暴int
            while (n % i == 0) n /= i;
        }
    }
    if (n > 1) res = res / n * (n - 1);
    return res;
}
int main()
{
    int n, k;
    while (~scanf("%d %d", &n, &k)) {
        int num = fact(n);
        int base = k / num;
        k %= num;
        if (!k) { printf("%d\n", base * n - (n != 1)); continue; } //注意n=1的间隔比较特殊
        
        int res = base * n;
        while (k) {
            res++;
            if (gcd(res, n) == 1) k--;
        }
        
        printf("%d\n", res);
    }
    return 0;
}

END

上一篇:2006年上半年程序员考试下午真题自我汇总


下一篇:UnoPlatform 的试用笔记-3 常见问题