【NOIP2012提高组】同余方程 {扩展欧几里得算法/模板}

题目

Description
求关于x的同余方程ax ≡ 1 (mod b)的最小正整数解。

Input
输入文件为mod.in。
输入只有一行,包含两个正整数 a, b,用一个空格隔开。

Output
输出文件为mod.out。
输出只有一行,包含一个正整数 x ,即最小正整数解。输入数据保证一定有解。


解题思路

a p a ( m o d   p )

a φ ( n ) 1 ( m o d   n )

a b a b   m o d   φ ( n ) ) ( m o d   n )

扩展欧几里得算法模板 :

int gcd(int a,int b,int &x,int &y)
{
  if (b==0) { x=1,y=0; return a;}
  int d=gcd(b,a%b,x,y); 
  int z=x; x=y; y=z-y*(a/b); 
  return d;
}

代码

#include<cstdio>
using namespace std; 
int a,b,x,y; 
void gcd(int a,int b)
{
    if (b==0) { x=1; y=0; return;}
    gcd(b,a%b); 
    int z=x; x=y; y=z-y*(a/b); 
}
int main()
{
    scanf("%d%d",&a,&b); 
    gcd(a,b); 
    printf("%d",(x%b+b)%b); 
}

猜你喜欢

转载自blog.csdn.net/qq_39897867/article/details/80978298