扩展欧几里得(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

 

 

posted @ 2021-03-12 19:22  mikku  阅读(49)  评论(0)    收藏  举报