1 条题解
-
0
题目分析
本题要求解线性同余方程 ,其中 和 是给定的正整数,且保证有解(即 )。
解题思路
这个方程实际上是在求 在模 意义下的乘法逆元 ,即 。由于题目保证 ,因此可以使用扩展欧几里得算法求解。
扩展欧几里得算法原理
扩展欧几里得算法用于求解方程 。当 时,方程变为 。对两边同时取模 ,得到 。因此,我们求得的 就是原方程的解。
算法步骤
- 使用扩展欧几里得算法求出 的一组解
- 由于解不唯一,需要将 调整到最小正整数解:
代码实现分析
#include <bits/stdc++.h> using namespace std; int exgcd(int a, int b, int &x, int &y) { if (b == 0) { x = 1; y = 0; return a; } int d = exgcd(b, a % b, y, x); y -= (a / b) * x; return d; } int main() { int a, b, x, y; cin >> a >> b; exgcd(a, b, x, y); cout << ((x % b) + b) % b; // 求ax+by=1的最小x正整数解 return 0; }代码解析
-
exgcd函数:递归实现扩展欧几里得算法
- 基准情况:当 时,,,返回
- 递归调用:计算 ,同时交换 和 的位置
- 更新公式:
-
主函数:
- 读入 和
- 调用 exgcd 求解
- 输出最小正整数解:
复杂度分析
- 时间复杂度:,扩展欧几里得算法的时间复杂度与欧几里得算法相同
- 空间复杂度:,递归调用栈的深度
示例验证
对于样例输入:3 10
扩展欧几里得算法求解过程:
- 求解
- 求得 ,
- 验证:
输出:7
总结
本题是经典的数论问题,核心在于理解扩展欧几里得算法的原理和应用。通过求解贝祖等式 ,当 时,得到的 就是 在模 意义下的逆元,再通过模运算调整即可得到最小正整数解。
- 1
信息
- ID
- 4150
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者