一、欧几里德算法:即辗转相除法,用于求两个整数a,b的最大公约数
见:最大公约数模板
二、扩展欧几里德算法:对于不完全为0的非负整数a,b,gcd(a,b)表示a,b的最大公约数,必然存在整数对x,y,使得gcd(a,b)=ax+by。
kb2.3扩展欧几里德算法(求ax+by=gcd的解以及逆元)
#include<iostream> #include<stdio.h> using namespace std; //返回d=gcd(a,b);和对应于等式ax+by=d中的x,y long long extend_gcd(long long a,long long b,long long &x,long long &y){ if(a==0&&b==0)return -1;//无最大公约数 if(b==0){x=1;y=0;return a;} long long d=extend_gcd(b,a%b,y,x); y-=a/b*x; return d; } //求逆元 //ax=1(mod n) long long mod_reverse(long long a,long long n){ long long x,y; long long d=extend_gcd(a,n,x,y); if(d==1)return (x%n+n)%n; else return -1; } int main(){ long long a,b,x,y; scanf("%lld%lld",&a,&b); long long d=extend_gcd(a,b,x,y); printf("%lld x=%lld y=%lld\n",d,x,y); return 0; }
时间: 2024-11-07 08:33:15