java---扩展欧几里得---线性同余方程(每日一道算法2022.9.18)

注意事项
涉及对extend_gcd的运用,可以看我之前的文章:java—扩展欧几里得算法(extend gcd)

题目
给定 n 组数据 ai,bi,mi,对于每组数求出一个 xi,使其满足 ai×xi≡bi(modmi),如果无解则输出 impossible

第一行包含整数 n
接下来 n 行,每行包含一组数据 ai,bi,mi

输出共 n 行,每组数据输出一个整数表示一个满足条件的 xi,如果无解则输出 impossible
每组数据结果占一行,结果可能不唯一,输出任意一个满足条件的结果均可
输出答案必须在 int 范围之内

输入:
2
2 3 6
4 3 5
输出:
impossible
-3
public class 扩展欧几里得算法_线性同余方程 {
    public static int x, y;
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();

        while (n-- > 0) {
            int a = in.nextInt(), b = in.nextInt(), m = in.nextInt();
            
            int d = ex_gcd(a, m);
            //区别主要在这里,推导过程就是ax-b=my = ax+my'=b, 然后gcd(a,m) = ax0+my0 = d, 可以得知d一定是b的除数/整数因子
            //如果b%d成立,那么就根据d推算x的结果,x = x0 * b/d % m, %m主要是防止int溢出
            //如果b%d不成立,就输出impossible即可
            if (b % d == 0) System.out.println((long) x * b/d % m);
            else System.out.println("impossible");
        }
    }
    
    //这里还是extend_gcd的写法不变![请添加图片描述](https://img-blog.csdnimg.cn/913d2efa9a0d4ac5b0997487558b0de8.jpeg)

    public static int ex_gcd(int a, int b) {
        if (b == 0) {
            x = 1; y = 0; return a;
        }
        int d = ex_gcd(b, a%b);
        int temp = x;
        x = y;
        y = temp - a/b * y;
        return d;
    }
}

具体推导过程:
请添加图片描述

请添加图片描述
声明:算法思路来源为y总,详细请见https://www.acwing.com/
本文仅用作学习记录和交流

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值