1. 程式人生 > >51Nod 1256 乘法逆元

51Nod 1256 乘法逆元

esp sizeof 分隔 返回 online ack include str xtend

題目鏈接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1256

給出2個數M和N(M < N),且M與N互質,找出一個數K滿足0 < K < N且K * M % N = 1,如果有多個滿足條件的,輸出最小的。 Input
輸入2個數M, N中間用空格分隔(1 <= M < N <= 10^9)
Output
輸出一個數K,滿足0 < K < N且K * M % N = 1,如果有多個滿足條件的,輸出最小的。
Input示例
2 3
Output示例
2

題解:擴展GCD
 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <cstdio>
 5 #include <vector>
 6 #include <cstdlib>
 7 #include <iomanip>
 8 #include <cmath>
 9 #include <ctime>
10 #include <map>
11 #include <set
> 12 #include <queue> 13 using namespace std; 14 #define lowbit(x) (x&(-x)) 15 #define max(x,y) (x>y?x:y) 16 #define min(x,y) (x<y?x:y) 17 #define MAX 100000000000000000 18 #define MOD 1000000007 19 #define pi acos(-1.0) 20 #define ei exp(1) 21 #define PI 3.141592653589793238462 22 #define INF 0x3f3f3f3f3f 23
#define mem(a) (memset(a,0,sizeof(a))) 24 typedef long long ll; 25 ll gcd(ll a,ll b){ 26 return b?gcd(b,a%b):a; 27 } 28 bool cmp(int x,int y) 29 { 30 return x>y; 31 } 32 const int N=10005; 33 const int mod=1e9+7; 34 /* 35 * 擴展歐幾裏得法(求ax + by = gcd) 36 */ 37 // 返回d = gcd(a, b);和對應於等式ax + by = d中的x、y 38 ll extendGcd(ll a,ll b,ll &x,ll &y) 39 { 40 if (a == 0 && b == 0){ 41 return -1; // 無最大公約數 42 } 43 if (b == 0){ 44 x = 1; 45 y = 0; 46 return a; 47 } 48 ll d = extendGcd(b, a % b, y, x); 49 y -= a / b * x; 50 return d; 51 } 52 // 求逆元 ax = 1(mod n) 53 ll modReverse(ll a, ll n) 54 { 55 ll x, y; 56 ll d = extendGcd(a, n, x, y); 57 if (d == 1){ 58 return (x % n + n) % n; 59 } 60 else{ 61 return -1; // 無逆元 62 } 63 } 64 int main() 65 { 66 ll M, N; 67 while (cin >> M >> N){ 68 cout << modReverse(M, N) << endl; 69 } 70 return 0; 71 }

51Nod 1256 乘法逆元