CJOJ 1029 【NOIP2012】同余方程

【NOIP2012】同余方程

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。

Source

NOIP2012,数论,拓展欧几里得,欧拉函数

Solution

扩展欧几里得求方程的最小正整数解

Code

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define L
#define LL long long
using namespace std;

inline int gi() {
  char cj = getchar();
  int ans = 0, f = 1;
  while (cj < '0' || cj > '9') {
    if (cj == '-') f = -1;cj = getchar();
  }
  while (cj >= '0' && cj <= '9') ans = ans * 10 + cj - '0', cj = getchar();
  return f * ans;
}

LL a, b, x, y;

inline void exgcd(LL a, LL b, LL& x, LL& y) {
  if (b == 0) {x = 1, y = 0;}
  else {
    exgcd(b, a % b, y, x);
    y -= (a / b) * x;
  }
}

int main() {
  freopen("CJOJ1029.in", "r", stdin);
  freopen("CJOJ1029.out", "w", stdout);
  a = gi(), b = gi();
  exgcd(a, b, x, y);
  while (x < 0) x += b;
  printf("%lld\n", x);
  return 0;
}


你可能感兴趣的:(数论)