洛谷1082 同余方程

来源:互联网 发布:学生证办理 淘宝 编辑:程序博客网 时间:2024/06/04 19:34

来源

NOIP 2012 提高组 D2T1

题目描述

求关于 x 的同余方程 ax1(modb)的最小正整数解。
传送门

算法

既然是第二天第一题,又有同余,那肯定是数论题、、、
那么数论中有什么常和同余放在一起的内容呢?
可以想到扩展欧几里德,它与同余有关。

何为扩欧?
对于不完全为 0 的非负整数 a,b,gcdab表示 a,b 的最大公约数,必然存在整数对 x,y ,使得 gcdab=ax+by

扩欧的作用主要在三个方面:

  • 求解不定方程
  • 求解线性同余方程
  • 求模的逆元

当然本题只需要用到第三个。

ax1(modb) 等价于 ax+by=1
也就是要求x,正是扩欧的用武之处。

注意得到的解可能是负的,要手动取模。

代码

#include <algorithm>#include <iostream>#include <cstdlib>#include <cstring>#include <cstdio> using namespace std;void mengbi(int a,int b,int &x,int &y) //求ax+by=1的函数(不要在意名字){    if (!b) x=1,y=0;    else    {        mengbi(b,a%b,y,x);        y-=x*(a/b);    }}int main(){    int a,b,x,y;    scanf("%d%d",&a,&b); //输入    mengbi(a,b,x,y); //求值     printf("%d\n",((x%b)+b)%b); //输出(记得取模)    return 0;}

后记

这是一道扩欧的题目,值得一做

原创粉丝点击