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; }