扩展欧几里得(P1082同余方程&&P5656二元一次不定方程)
关于exgcd的方方面面。这篇题解我认为是讲的最清楚的了。
P1082 [NOIP2012 提高组] 同余方程
x,y的递推公式就不说了。x=y1,y=b(x1-(a/b)*y1) (自己列式子算吧)
对于x和y的改变。令x+=kb.则原式子为ax+by=m变为a(x+kb)+by-kab=m --->a(x+kb)+b(y-ka)=m。
故当x加上k个b,y减去k个a时,等式依旧成立。
AC代码如下(注意开long long):
#include<cstdio> #include<algorithm> #include<cstring> #include<queue> #include<vector> #define MAXN 505 using namespace std; typedef pair<int,int> pii; typedef long long ll; ll a,b,x,y;//x,y为真正的解 void exgcd(ll a,ll b){ if(b==0){//真正的解 x=1; y=0; return ; } exgcd(b,a%b); ll temp=x; x=y; y=temp-a/b*y; } int main(){ scanf("%lld%lld",&a,&b); exgcd(a,b); x=(x%b+b)%b; printf("%lld\n",x); return 0; }
P5656 【模板】二元一次不定方程 (exgcd)
本题是exgcd各种考点的综合。
(基本上a了这题exgcd就是彻底搞懂了(大概))
先mark一下qwq