洛谷 P1082 同余方程 题解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 P1082 同余方程 题解相关的知识,希望对你有一定的参考价值。

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。

题目链接:https://www.luogu.org/problem/show?pid=1082

题目描述

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

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例#1:
3 10
输出样例#1:
7

说明

【数据范围】

对于 40%的数据,2 ≤b≤ 1,000;

对于 60%的数据,2 ≤b≤ 50,000,000;

对于 100%的数据,2 ≤a, b≤ 2,000,000,000。

NOIP 2012 提高组 第二天 第一题

 

分析:

网上证明很多,不再赘述。其实是不太会证

可以参考博客的证明。

但是可以分享一下qbxt张浩威的求解过程:

gcd(12,7)=(7,5)=(5,2)=(2,1)=(1,0)=1。
其中1*1+0*0=1;
也即1*1+0*(2-2*1)=1     -->   0*2+1*1=1
也即0*2+1*(5-2*2)=1    -->  1*5-2*2=1
也即1*5-2*(7-1*5)=1     -->  -2*7+3*5=1
也即-2*7+3*(12-1*7)=1 -->  3*12-5*7=1
求得x=3  y=-5。

 

AC代码:

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<cstring>
 5 
 6 const int MAXN = 1000005;
 7 
 8 inline void read(int &x)
 9 {
10     char ch = getchar(),c = ch;x = 0;
11     while(ch < 0 || ch > 9) c = ch,ch = getchar();
12     while(ch >= 0 && ch <= 9) x = (x<<1)+(x<<3)+ch-0,ch = getchar();
13     if(c == -) x = -x;
14 }
15 
16 int a,b,x,y;
17 
18 void exgcd(int a,int b,int &x,int &y)
19 {
20     if(!b)
21     {
22         x = 1,y = 0;
23         return;
24     }
25     exgcd(b,a%b,y,x);
26     y -= x*(a/b);
27 }
28 
29 int main()
30 {
31     read(a),read(b);
32     exgcd(a,b,x,y);
33     printf("%d\\n",(x+b)%b);
34     return 0;
35 }

 

以上是关于洛谷 P1082 同余方程 题解的主要内容,如果未能解决你的问题,请参考以下文章

洛谷P1082 同余方程 数论

洛谷 P1082 同余方程

洛谷 P1082 同余方程

洛谷P1082同余方程

洛谷 P1082 同余方程

[NOIP2012] 提高组 洛谷P1082 同余方程