首页 > 代码库 > NOIP2012 同余方程-拓展欧几里得

NOIP2012 同余方程-拓展欧几里得

题目描述

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

输入输出格式

输入格式:

输入只有一行,包含两个正整数 a, b,用一个空格隔开。

输出格式:

输出只有一行,包含一个正整数 x0,即最小正整数解。输入数据保证一定有解。

 

技术分享
 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<cstdlib>
 5 #include<cmath>
 6 #include<algorithm>
 7 #define LL long long
 8 #define FOR(a,b,c) for(int a=b;a<=c;a++)
 9 #define maxn 1024
10 using namespace std;
11 LL a,b,d,x,y,k;
12 void ggcd(LL a,LL b,LL &d,LL &x,LL &y){
13     if(b==0){
14         d=a;
15         x=1;
16         y=0;
17     }else{
18         ggcd(b,a%b,d,y,x);
19         y-=x*(a/b);
20     }
21 }
22 int main()
23 {
24     scanf("%lld%lld",&a,&b);
25     ggcd(a,b,d,x,y);
26     k=b/d;
27     while(x>=0) x-=k;
28     while(x<=0) x+=k;
29     printf("%lld",x);
30     return 0;
31 }
View Code

 

NOIP2012 同余方程-拓展欧几里得