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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逍遥Fau

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值