2019西安联训B层 Day 6练习题 问题 C: 扩展欧几里得

noip原题

扩欧入门裸题,题中的同余方程看作ax+by=1,记住一个重要的结论形如ax+by=c的方程的最小正整数解为(x*(c/gcd(a,b))%abs(b/gcd(a,b))+abs(b/gcd(a,b)))%gcd(b/gcd(a,b))可以看我之前有关扩欧算法的博客。

#include<bits/stdc++.h>
using namespace std;
long long a,b,x,y;
long long gcd;
long long Exgcd(long long a,long long &x,long long b,long long &y){
    if(b==0){
        x=1;
        y=0;
        return a;
    }
    long long Gcd=Exgcd(b,x,a%b,y);
    long long tmp=x;
    x=y;
    y=tmp-(a/b)*x;
    return Gcd;
}
int main(){
    scanf("%lld%lld",&a,&b);
    gcd=Exgcd(a,x,b,y);
    printf("%lld",(x/gcd%(b/gcd)+b/gcd)%(b/gcd));//对于扩欧来说很重要的一个结论 
    return 0;
}

 

posted @ 2019-06-12 14:14  JBLee  阅读(135)  评论(0编辑  收藏  举报