数论 - 扩展欧几里得算法求 方程的整数解

题意:
直线上的点。求直线ax+by+c=0上有多少个整点(x,y)满足x∈[x1,x2],y∈[y1,y2]

扩展欧几里得算法:
求ax + by = gcd(a,b)解

void gcd(int a,int b,int& d,int& x,int& y)
{
    if(!b) {d = a;x = 1;y = 0;}
    else {gcd(b,a%b,d,y,x);y -= x*(a/b);}
}

求出来的x1和y1是一组解

设另外一组解x2和y2,则有:a * x1 + b * y1 = a * x2 + b * y2
变形为: a(x1 - x2) = b(y2 - y1),当俩边同时除以gcd(a,b)后
那么可以得出结论:(x1 - x2) 一定为b的整数倍,(y2 - y1)也一定为a的整数倍
所以有:y2-y1 = k * a/gcd(a,b)

所以推导出:
设a,b,c为任意整数。若方程ax + by = c的一组解为(x0,y0),那么任意整数解都可以写成
(x0 + k * b/gcd(a,b) , (y0-k * a/gcd(a,b)) )
求出一组特解很容易,直接先使得c为1,然后就可以利用扩展欧几里得求出一组特解然后再用公式即可
(只有当c为gcd(a,b)的倍数的时候才有整数解)

例题

如果要求逆元的话,那么有方程ax %b == 1%b
a是要求逆元的那个数,b是模数,那么也就恒等为:
a
x + b*y == 1 也就是可以exgcd(a,b,x,y) 求出来的也就是x也就是a的逆元。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值