exgcd拓展欧几里得

来源:互联网 发布:淘宝天天特价首页 编辑:程序博客网 时间:2024/06/08 00:56

最近在啃数学题……马上noip+半期考了文化课基本弃疗……
拓展欧几里得:计算gcd(a,b)同时计算ax+by=d的符合条件的x,y;
通常我们求gcd,在b!=0时进入下一个状态,即求gcd(b,a%b);exgcd也是一样,我们使bx’+(a%b)y’=d;
这两个状态间其实有联系
由a%b=a-(a/b)*b珂知
d=bx’+[a-(a/b)*b] *y’=bx’+ay’-(a/b)by’
=ay’+b(x’-(a/b)y’)
不会latex哭死……
由上知x=y’,y=x’-a/b*y;
代码如下

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

exgcd例题:noip2012同余方程
描述

求关于x的同余方程ax ≡ 1 (mod b)的最小正整数解。
格式

输入格式

输入只有一行,包含两个正整数a, b,用一个空格隔开。
输出格式

输出只有一行,包含一个正整数x0,即最小正整数解。输入数据保证一定有解。
样例1

样例输入1

3 10
Copy
样例输出1

7
Copy
限制

每个测试点1s
提示

对于40%的数据,2 ≤b≤ 1,000;
对于60%的数据,2 ≤b≤ 50,000,000;
对于100%的数据,2 ≤a, b≤ 2,000,000,000。
来源

Noip2012提高组复赛Day2T1

#include<bits/stdc++.h>using namespace std;int exgcd(int a,int b,int &x,int &y){    if(b==0){        x=1;        y=0;        return a;    }    int r=exgcd(b,a%b,x,y);    int t=x;x=y;y=t-a/b*y;    return r;}int main(){    int a,b,x,y;    cin>>a>>b;    exgcd(a,b,x,y);    if(x<1) x+=b;//注意x会小于0     cout<<x;    return 0;}
原创粉丝点击