洛谷 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 同余方程 题解的主要内容,如果未能解决你的问题,请参考以下文章