【数学 扩展欧几里得】luogu_1082 同余方程

本文介绍了一种求解同余方程ax≡1(mod b)的最小正整数解的方法,利用欧几里得算法找到特解x0,并通过取模操作将其调整到1至b的范围内。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意

求关于xxx的同余方程ax≡1(mod b)a x \equiv 1 (mod\ b)ax1(mod b)的最小正整数解。

思路

对于方程ax≡b(mod m)a x \equiv b (mod\ m)axb(mod m),可以看成ax−bax-baxbmmm的倍数,设是−y-yy倍,那么就可以改写成方程:
ax+my=bax+my=bax+my=b
那么用欧几里得算法可以求出一组特解x0,y0x_0,y_0x0,y0,通过取模操作把x0x_0x0移到1∼b1\sim b1b中,即为答案。

代码

#include<cstdio>

long long a, b, x, y;

long long exgcd(long long a, long long b, long long &x, long long &y) {
	if (!b) {
		x = 1;
		y = 0;
		return a;
	}
	long long d = exgcd(b, a % b, x, y);
	long long z = x;
	x = y;
	y = z - y * (a / b);
	return d;
}

int main() {
	scanf("%d %d", &a, &b);
	exgcd(a, b, x, y);
	printf("%d", (x % b + b) % b);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值