數論擴充套件歐幾里德基礎習題(4.15)
阿新 • • 發佈:2019-02-09
題目:
題目描述
求關於 x 的同餘方程 ax ≡ 1 (mod b)的最小正整數解。輸入
輸入只有一行,包含兩個正整數 a, b,用一個空格隔開。輸出
輸出只有一行,包含一個正整數 x0,即最小正整數解。輸入資料保證一定有解。樣例輸入
3 10
樣例輸出
7
思路:對題目中的式子進行變形可以得到ax - by = 1.可用擴充套件歐幾里德算出一組x,y
由於保證資料肯定有解,可知gcd(a,b) = 1
由書中可知 x` = x + kb`,y` = y + k a`.其中(a` = a/gcd(a,b),b` = b / gcd(a,b) )
long long temp = b / d;/*注:因為要求最小,依舊要滿足方程,那麼要保證當x改變,依舊是成立的。而b / d 作為x改變值,是能使得方程成立的最小值(如果肯能是負數要換成整數)*/
x = (x % temp + temp) % temp;的方法確保是最小的整數解
get
程式碼:
#include <iostream> #include <cstdio> #include <cstring> #include <sstream> #include <string> #include <algorithm> #include <list> #include <map> #include <vector> #include <queue> #include <stack> #include <cmath> #include <cstdlib> using namespace std; void gcd(long long a,long long b,long long &d,long long &x,long long &y) { if(!b) { d = a,x = 1,y = 0; } else { gcd(b,a%b,d,y,x); y -= x *(a/b); } } int main() { // freopen("in.txt","r",stdin); long long a,b; scanf("%lld%lld",&a,&b); long long d,x,y; gcd(a,b,d,x,y); long long temp = b / d; x = (x % temp + temp) % temp; printf("%lld\n",x); return 0; }