[NOIp 2012]同余方程
阿新 • • 發佈:2017-10-07
stream scan pri queue aws size math 關於 輸入
Description
求關於 x 的同余方程 ax ≡ 1 (mod b)的最小正整數解。Input
輸入只有一行,包含兩個正整數 a, b,用一個空格隔開。Output
輸出只有一行,包含一個正整數 x0,即最小正整數解。輸入數據保證一定有解。Sample Input
3 10
Sample Output
7
Hint
【數據範圍】
對於 40%的數據,2 ≤b≤ 1,000;
對於 60%的數據,2 ≤b≤ 50,000,000;
對於 100%的數據,2 ≤a, b≤ 2,000,000,000。
題解
既然保證有解,那麽肯定有$gcd(a, b) = 1$,用$exgcd$求出$ax+by = 1$的一組解,再求出$x$的最小正整數解。
1 //It is made by Awson on 2017.10.7 2 #include <map> 3 #include <set> 4 #include <cmath> 5 #include <ctime> 6 #include <queue> 7 #include <stack> 8 #include <vector> 9 #include <cstdio> 10 #include <string> 11 #include <cstdlib> 12#include <cstring> 13 #include <iostream> 14 #include <algorithm> 15 #define LL long long 16 #define Max(a, b) ((a) > (b) ? (a) : (b)) 17 #define Min(a, b) ((a) < (b) ? (a) : (b)) 18 using namespace std; 19 20 LL a, b, x, y; 21 22 LL exgcd(LL a, LL b, LL &x, LL &y) {23 if (b == 0) { 24 x = 1; y = 0; 25 return a; 26 } 27 LL c = exgcd(b, a%b, x, y); 28 LL t = x; 29 x = y; 30 y = t-a/b*y; 31 return c; 32 } 33 void work() { 34 scanf("%lld%lld", &a, &b); 35 LL gcd = exgcd(a, b, x, y); 36 printf("%lld\n", (x%b+b)%b); 37 } 38 int main() { 39 work(); 40 return 0; 41 }
[NOIp 2012]同余方程