2 条题解

  • 1
    @ 2025-2-22 11:12:19

    引入一个定理:Bezout定理

    对于任意整数 a,ba,b 存在一对整数x,yx,y,满足ax+by=gcd(a,b)ax+by=gcd(a,b)

    证明:

    在欧几里得算法的最后一步,即b=0b=0时,显然有一对整数,x=1,y=0x=1,y=0 ,满足ax+by=a1+b0=gcd(a,0)ax+by=a*1+b*0=gcd(a,0)

    B>0B>0gcd(a,b)=gcd(b,amodb)gcd(a,b)=gcd(b,a mod b).

    假设存在一对整数x,yx,y,满足bx+(amodb)y=gcd(b,amodb)b*x+(a mod b) * y=gcd(b,a mod b) ,因为$b*x+(a mod b)*y=b*x+(a-(a/b)*b)*y=a*y+b*(x+(a/b)*y)$ 所以令x=y,y=(x+(a/b)y)x'=y,y'=(x+(a/b)*y)

    此时的x,yx',y'便满足ax+by=gcda,ba*x'+b*y'=gcd(a,b) 逆推即可得到一组特解

    aa 变成最小正整数便得出答案

    #include<bits/stdc++.h>
    #define ll long long 
    using namespace std;
    ll a,b,x,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 z=x;
    	x=y;
    	y=(z-y*(a/b));
    	return ans;
    	
    } 
    int main()
    {
    	scanf("%d%d",&a,&b);
    	exgcd(a,b,x,y);
    	cout<<(x % b + b) % b;
     } 
    

    信息

    ID
    204
    时间
    1000ms
    内存
    128MiB
    难度
    4
    标签
    递交数
    32
    已通过
    19
    上传者