扩展欧几里得模板+例题

1.贝祖定理

满足方程 a x + b y = c ax+by=c ax+by=c 有解的充分必要条件是 g c d ( a , b ) ∣ c gcd(a,b) | c gcd(a,b)c

2.欧几里得定理

用辗转相除求a,b的最大公因数

ll gcd(ll a,ll b)
{
	if(b==0) 
		return a;
	else
		return gcd(b,a%b);
}

3.扩展欧几里得定理

扩展欧几里得定理目的是解不定方程

根据题意写出同余方程
a x ≡ c ( m o d   b ) ax ≡ c(mod \,b) axc(modb)
根据同余方程写出不定方程
a x + b y = c ax+by=c ax+by=c

用来求方程 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b) 的特解
进而求出 a x + b y = c ax+by=c ax+by=c 的通解

特解 x 0 , y 0 x_0,y_0 x0,y0
通解
x = x 0 ∗ c g c d ( a , b ) + k ∗ b g c d ( a , b ) x=x_0*{c\over gcd(a,b)}+{k*b\over gcd(a,b)} x=x0gcd(a,b)c+gcd(a,b)kb
y = y 0 ∗ c g c d ( a , b ) − k ∗ a g c d ( a , b ) y=y_0*{c\over gcd(a,b)}-{k*a\over gcd(a,b)} y=y0gcd(a,b)cgcd(a,b)ka
k ∈ Z k\in Z kZ

ll exgcd(ll a,ll b,ll &x,ll &y)
{
	if(b==0)
	{
		x=1;y=0;
		return a;
	}
	ll g = exgcd(b,a%b,y,x);
	y-=a/b*x;
	return g;
}

这里返回值仍然是 g c d ( a , b ) gcd(a,b) gcd(a,b) ,在过程中,特解被存储在 x,y 之中根据题意求出所需的解

扩展欧几里得解题一般思路

1.根据题意写出同余方程
a x ≡ c ( m o d   b ) ax ≡ c(mod \,b) axc(modb)
2.根据同余方程列出式子
a x + b y = c ax+by=c ax+by=c
带入扩展欧几里得求解
3.求最小整数解
x = ( x % b + b ) % b x=(x\%b+b)\%b x=(x%b+b)%b(这里 x 与 b x与b xb 都是处理过的)
要保证b是正数

扩展欧几里得的难点在于找出同余方程并转化为不定方程

例题

1.P1082 [NOIP2012 提高组] 同余方程
(扩欧板子,求最小整数解)
同余方程题解

2.C Looooops 牛客
(扩欧板子,求最小整数解)
C Looooops 题解

3.Euclid Problem 牛客
(扩欧板子,求最小整数解)

4.青蛙的约会 牛客
(扩欧板子,求最小整数解)
青蛙约会题解

5.Disgruntled Judge 牛客
(扩欧进阶,找不定方程,枚举未知数)
Disgruntled Judge 题解

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.Ashy.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值