Advertisement

洛谷P5656 模板二元一次不定方程(exgcd)

阅读量:

扩展欧几里得算法
本题重点:
1、求解 a_x + b_y = c 的所有正整数解。
其中前提条件是 a、b、c 均为正整数,在后续计算中将对此进行处理以简化运算过程。
2、设 d 为 a 和 b 的最大公约数,则若 c 不能被 d 整除,则该方程组无整数解;
3、通过扩展欧几里得算法 exgcd 求得 a_x + b_y = gcd(a, b) 的一组特解 x₀ 和 y₀;
由此可推导出原方程组 a_x + b_y = c 的通项表达式:
x = (c/d)x₀ + k(b/d),y = (c/d)y₀ - k(a/d),其中 k 属于全体整数值集合 Z;
4、定义 m₁ = b/d 和 m₂ = a/d,则变量 x 的最小正数值 min_x 可由下式计算得出:
min_x ≡ (x mod m₁) ? ((m₁ - (x mod m₁)) : 0);
同样地变量 y 的最小正数值 min_y 则为:min_y ≡ (y mod m₂) ? ((m₂ - (y mod m₂)) : 0);
需要注意的是计算结果可能为零值,在此情况下只需分别加上 m₁ 或 m₂ 即可获得所需的最小正值;
5、当变量 x 达到其最小正值时,请注意此时对应的变量 y 将达到其最大正值(若有)。

复制代码
    #include <cstdio>

全部评论 (0)

还没有任何评论哟~