GCD LCM 欧几里得算法 扩展欧几里得算法
生活随笔
收集整理的這篇文章主要介紹了
GCD LCM 欧几里得算法 扩展欧几里得算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
歐幾里得算法:
輾轉相除法的關鍵恒等式:gcd(a,b)=gcd(b,a mod b);
邊界條件:gcd(a,0)=a;
//最大公約數 int gcd(int a,int b) {return b==0?a:gcd(b,a%b);}?公式:?
gcd(a,b)*lcm(a,b) = a*b;
最小公倍數:
lcm(a,b)=a/gcd(a,b)*b;//先除后除?
lcm(a,b)=a*b/gcd(a,b); //錯誤,a*b可能會溢出?
擴展歐幾里得算法:
//求整數x和y,使得a*x+b*y=d,且|x|+|y|最小,d=gcd(x,y) void exgcd(ll a,ll b,ll &d,ll &x,ll &y) {if(!b) {d=a; x=1; y=0;}else {exgcd(b,a%b,d,y,x);y-=x*(a/b);} }給一個不定方程Ax+By+C=0. 這個方程是否存在整數解?
如果存在,就輸出一組x和y,否則輸出-1
輸入
有多組樣例,每行三個數字A,B,C
-2×10^9?< A,B,C <?2×10^9?
輸出
若有解,輸出一行x和y,以空格隔開。否則輸出-1
樣例輸入
2 5 3 931480234 -1767614767 -320146190 -1548994394 -1586527767 -1203252104 1906842444 749552572 -1693767003 -1183748658 875864960 -1315510852 200000003 200000001 1樣例輸出
6 -3 -98880374013340920 -52107006370101410 -878123061596147680 857348814150663048 -1 -97498198168399474 -131770725522871624 100000000 -100000001?一個二元一次方程如果存在整數解,那么就有多組(x,y)滿足方程,用擴展歐幾里得定理求出來的(x,y)是確定的
如果? C%gcd(A,B)不等于0,說明方程 Ax + By = C 無整數解。
#include<bits/stdc++.h> using namespace std; typedef long long ll; void exgcd(ll a,ll b,ll &d,ll &x,ll &y)//擴展歐幾里得 {if(!b){//若b=0,gcd(a,b)=gcd(a,0)=a;d=a;//a,b的最大公約數x=1;y=0;}else{exgcd(b,a%b,d,y,x);y-=x*(a/b);} } int main() {ll a,b,c;while(scanf("%lld%lld%lld",&a,&b,&c)!=EOF){ll x=0,y=0,d=0;exgcd(a,b,d,x,y);//printf("%d\n",d);if(c%d==0)printf("%lld %lld\n",-x*(c/d),-y*(c/d));//求不定方程Ax+By+C=0的一組整數解//printf("%lld %lld\n",x*(c/d),y*(c/d));//求不定方程Ax+By=c的一組整數解else//不存在整數解printf("-1\n");}return 0; }?
總結
以上是生活随笔為你收集整理的GCD LCM 欧几里得算法 扩展欧几里得算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 字符检测函数
- 下一篇: 筛法求素数 素数打表