拓展欧几里得应用

5 篇文章 0 订阅

个人小理解

求a≡bmol(l)

ax + ly = b

ax + ly = gcd(a,l)

这时就可以用拓展欧几里得求

ex_gcd(a,l);

求出一组解(x0,y0);

通解:

X = x0 + t*(l/gcd(a,l));

Y = y0 - t*(a/gcd(a,l));

原方程解:

X = x0*b/gcd(a,l);

Y = y0*b/gcd(a,l);

例题:poj1061

链接:点击打开链接

模板题  代码如下:

 

import java.util.Scanner;

public class Main {
	public static long[] ec_gcd(long a, long b) {//java版拓展欧几里得模板
		long ans;
		long result[] = new long[3];
		if (b == 0) {
			result[0] = a;
			result[1] = 1;
			result[2] = 0;
			return result;
		}
		long temp[] = ec_gcd(b, a % b);
		ans = temp[0];
		result[0] = ans;
		result[1] = temp[2];
		result[2] = temp[1] - (a / b) * temp[2];
		return result;
	}

	@SuppressWarnings("resource")
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while (scanner.hasNext()) {
			long x = scanner.nextLong();
			long y = scanner.nextLong();
			long m = scanner.nextLong();
			long n = scanner.nextLong();
			long l = scanner.nextLong();
			long a = m - n;
			long b = l;
			long c = y - x;
			if (a < 0) {
				a = -a;
				c = -c;
			}
			long[] result = new long[3];
			result = ec_gcd(a, l);
			if (c % result[0] != 0 || (m == n && x != y)) {
				System.out.println("Impossible");
			} else {
				b = b / result[0];
				c = c / result[0];
				result[1] = c * result[1];//求原方程的x解,数有可能求得不是想要的那个解
				System.out.println((result[1] % b + b) % b);//我们把它取模就好

			}
		}
	}
}

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值