#tYybttg060402. 1632:【 例 2】[NOIP2012]同余方程
1632:【 例 2】[NOIP2012]同余方程
1632:【 例 2】[NOIP2012]同余方程
题目描述
求关于 的同余方程 的最小正整数解。
输入格式
输入只有一行,包含两个正整数 ,用一个空格隔开。
输出格式
输出只有一行,包含一个正整数 ,即最小正整数解。输入数据保证一定有解。
样例
样例输入 #1
3 10
样例输出 #1
7
样例解释 #1
- 方程:。
- 验证:,,所以 是解。
- 最小正整数解就是 。
数据范围
- 对于 的数据,有 ;
- 对于 的数据,有 ;
- 对于 的数据,有 。
时空限制
- 时间限制:1000 ms
- 内存限制:524288 KB
注意:本题是求解线性同余方程 的最小正整数解。这等价于求 在模 意义下的乘法逆元。因为方程有解当且仅当 (即 与 互质)。题目保证有解,所以 。
可以使用扩展欧几里得算法(exgcd)求解。扩展欧几里得算法用于求解方程 的一组整数解 。由于 ,方程 有解,取模 可得 ,所以 就是 模 的逆元。注意求出的 可能是负数,需要调整为最小正整数解:。
具体步骤:
- 使用 exgcd 求解 的一组解 。
- 最小正整数解为 。
注意: 最大 ,计算过程中可能溢出,需要使用 long long 类型。
扩展欧几里得算法模板:
void exgcd(long long a, long long b, long long &x, long long &y) {
if (b == 0) {
x = 1; y = 0;
return;
}
exgcd(b, a % b, y, x);
y -= a / b * x;
}