第十四届蓝桥杯JavaA组省赛真题 - 互质数的个数

本文介绍了如何使用Java编程语言实现快速幂算法以及欧拉函数在求解大数取模问题中的应用,特别强调了取模时的正确书写方式和处理特殊情况如a=1的策略。
摘要由CSDN通过智能技术生成

解题思路:

快速幂 + 欧拉函数

快速幂比较常见于数据较大的取模场景,欧拉函数感觉还是有点抽象

注意:

取模的时候就不要简写了,例如:res = res * a % mod;不要写成res *= a % mod;

import java.util.Scanner;

public class Main {
    static int mod = 998244353;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long a = sc.nextLong();
        long b = sc.nextLong();
        // 如果a等于1,则直接输出0,因为任何数的0次方都是1
        if (a == 1) System.out.println(0);
        // 初始化结果res为a
        long res = a, x = a;

        // 循环,从2开始到x的平方根,检查x的因子
        for (int i = 2; i <= Math.sqrt(x); i++) {
            // 如果i是x的因子
            if (x % i == 0) {
                // 不断除以i,直到x不能被i整除
                while (x % i == 0) x /= i;
                // 根据欧拉定理,将res中所有i的因子替换为i-1
                res = res / i * (i - 1);
            }
        }
        // 如果x还有大于1的因子,重复上述操作
        if (x > 1) res = res / x * (x - 1);

        // 输出结果,为res乘以a的b-1次方,并对mod取模
        System.out.println(res * qmi(a, b - 1) % mod);
    }

    // 快速幂运算方法,用于计算a的b次方模mod的值
    private static long qmi(long a, long b) {
        long res = 1;
        while (b > 0) {
            if ((b % 2) == 1) res = res * a % mod;
            a = a * a % mod;
            b /= 2;
        }
        return res % mod;
    }
}

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值