题解 P1082 【同余方程】

ouuan

2018-02-07 16:41:14

Solution

感觉还没有人讲到为什么是exgcd(x,y,a,b)而不是exgcd(x,y,a,-b) 如果又是我看漏了的话..反正题解是写给自己看的 ------------ 错误思路: 由ax ≡ 1 (mod b)得ax=by+1 移项得:ax-by=1 于是天真的我一开始写的exgcd(x,y,a,-b),各种WA ------------ 先讲为什么可以exgcd(x,y,a,b): 其实一句话就可以说明,令y'=-y,ax+by'=ax-by,而本题只求x ------------ 然后是为什么不能exgcd(x,y,a,-b): 因为这题是基于gcd(a,y的系数(正解中的b,错解中的-b))=1的 而gcd(a,b)当b为负数时,可以举例看一下 gcd(12,-7)=gcd(-7,5)=gcd(5,-2)=gcd(-2,1)=gcd(1,0)=1 gcd(17,-5)=gcd(-5,2)=gcd(2,-1)=gcd(-1,0)=-1 可以看出,结果是1还是-1和gcd次数的奇偶有关,因此会出现大量WA ------------ 总结:使用exgcd时要注意a,b为正,求解ax=by+1(a,b为互质正整数)的解集时,要先求出ax+by=1的解集A',那么所求解集即为A{(x,y)|(x,-y)∈A'} ------------ 毕竟是题解..还是给份完整代码 ``` #include <iostream> using namespace std; void exgcd(int& x,int& y,int a,int b); int main() { int a,b,d,x,y,k; cin>>a>>b; exgcd(x,y,a,b); while (x<0) { x+=b; } cout<<x%b; return 0; } void exgcd(int& x,int& y,int a,int b) { if (b==0) { x=1; y=0; } else { exgcd(y,x,b,a%b); y-=a/b*x; } } ```