
AcWing 204 表达整数的奇怪方式
读取输入,初始化变量。 逐步处理每个同余方程组: 最后调整 x 到模最小的范围内,确保得到最小的非负解。 扩展欧几里得算法:用于找到贝祖系数,并返回最大公约数。这在合并同余方程时非常有用。 读取输入:首先读取输入数据,初始化变量。 逐步处理方程:对于每个方程,计算当前方程与解的兼容性,更新解 x 和模数。若在任何一步发现无解,立即返回 -1。 调整解 x:确保 x 是非负且最小的,适用于模运算的结果。 输出结果:根据处理结果输出 x,如果无解则输出 -1。
发布日期:2021-05-28 16:27:06
浏览次数:31
分类:精选文章
本文共 1393 字,大约阅读时间需要 4 分钟。
为了解决这个问题,我们需要找到满足一系列同余条件的最小非负整数 x。如果不存在这样的 x,则返回 -1。
方法思路
这个问题可以通过逐步合并同余方程来解决,每一步都确保当前解满足所有处理过的方程。我们使用扩展欧几里得算法来找到满足贝祖定理的条件,从而确保每一步都能正确地得到一个解,直到所有方程都被处理。
具体步骤如下:
- 计算当前方程组的最大公约数 (gcd)。
- 检查是否有解,若无解则返回 -1。
- 通过扩展欧几里得算法找到合适的系数,更新解 x 和模数 M。
解决代码
#include#include using namespace std;typedef long long ll;ll exgcd(ll a, ll b, ll &x, ll &y) { if (!b) { x = 1; y = 0; return a; } ll d = exgcd(b, a % b, y, x); y -= a / b * x; return d;}int main() { int n; cin >> n; if (n == 0) { cout << 0 << endl; return 0; } ll x = 0; ll a1; ll m1; cin >> a1 >> m1; for (int i = 0; i < n - 1; ++i) { ll a2, m2; cin >> a2 >> m2; ll d = exgcd(a1, -a2, k1, k2); if ((m2 - m1) % d != 0) { x = -1; break; } k1 = (k1 % (a2 / d) + a2 / d) % (a2 / d); x = k1 * a1 + m1; ll new_M = a1 / d * a2; a1 = new_M; m1 = x; x %= new_M; } if (x != -1) { x %= a1; if (x < 0) { x += a1; } } cout << x << endl; return 0;}
代码解释
通过这种方法,我们可以高效地解决问题,并确保找到满足所有同余条件的最小解。
发表评论
最新留言
不错!
[***.144.177.141]2025年05月05日 11时39分33秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Java选择排序算法实现
2019-03-12
00010.02最基础客户信息管理软件(意义类的小项目,练习基础,不涉及数据库)
2019-03-12
00013.05 字符串比较
2019-03-12
LeetCode: 138. 复制带随机指针的链表(中等)[DFS, 迭代]
2019-03-12
Effective Java 读书笔记
2019-03-12
SpringBoot使用@Email报错误
2019-03-13
Rabbitmq的内存磁盘监控
2019-03-13
访问servlet时弹出文件下载框解决方法
2019-03-13
Java中的注释
2019-03-13
cookie、session、token
2019-03-13
IDEA-@Slf4j和log标签&@Data(Lombok)无效
2019-03-13
Thymeleaf 生成下标,索引,使用Stat变量
2019-03-13
全局变量初始化顺序的不确定性引发的bug
2019-03-13
ValueError: Unexpected end of file.
2019-03-13
六、登录(二)
2019-03-13
初始微服务---Springcloud发展【第一期】
2019-03-13
RAFT 拜占庭将军 共识算法
2019-03-13
UE4 错误列表 error码(只记录我遇到的情况,持续添加,未完成)
2019-03-13