AcWing 878. 线性同余方程
. 线性同余方程
一、题目描述
给定 组数据 ,对于每组数求出一个 ,使其满足 ,如果无解则输出 impossible
。
输入格式
第一行包含整数 。
接下来 行,每行包含一组数据 。
输出格式
输出共 行,每组数据输出一个整数表示一个满足条件的 ,如果无解则输出 impossible
。
每组数据结果占一行,结果可能不唯一,输出任意一个满足条件的结果均可。
输出答案必须在 范围之内。
数据范围
输入样例:
2
2 3 6
4 3 5
输出样例:
impossible
-3
二、线性同余方程
【扩展欧几里得算法的一个典型应用】
举个栗子:
...
余数开始循环了,一直都是...
不会产生这个余数,所以,无解。
再来一个栗子:
....
所以有解,其它第一个解是 ,第二个解是。
这两个解之间差了一个,即,每加一个,都可以得到一个解。比如 也是一个解。
2、为什么线性同余方程可以使用欧几里得算法来求解呢?
- 表示意义 是,从而 。
假设是倍,因此线性同余方程转化为 , 移项: 。令 ,则: ,这就是一个标准的二元一次方程。
-
根据贝祖定理,上述等式有解当且仅当 ,也就是是的整数倍,有解;
如果不是的整数倍,无解,输出impossible
-
用扩展欧几里得求出一组特解 ,, 使得 。
-
对比两个方程:扩展欧几里得公式和线性同余方程两个东东
两个方程的左右两边,左边的系数是一样的,右边的常数不一样,一个是,另一个是,我们刚才上面讨论过,必须是的整数倍,方程才有解,也就是说,现在一定是的整数倍!
设 ,那么,其中是一个整数。
,
因为害怕在乘法运算过程中,造成爆,所以,出发前对进行了转操作,以保证不爆.同时,因为是同余方程,如果取得的值大于,还需要模一下.即:
(LL) b / d * x % m
三、实现代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int exgcd(int a, int b, int &x, int &y) {
if (!b) {
x = 1, y = 0;
return a;
}
int d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
int main() {
int n;
cin >> n;
while (n--) {
int a, b, m;
cin >> a >> b >> m;
int x, y;
int d = exgcd(a, m, x, y);
if (b % d)
puts("impossible");
else
printf("%d\n", (LL)b / d * x % m);
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2019-10-07 课堂上用人脸识别“记录分析”学生表情?我反对!
2019-10-07 jetbreains的crack方法
2015-10-07 现行开发模块测试地址