首页 > 其他分享 >P1082 [NOIP2012 提高组] 同余方程

P1082 [NOIP2012 提高组] 同余方程

时间:2023-12-19 12:34:02浏览次数:44  
标签:方程 gcd int bmod P1082 ax 同余 bx NOIP2012

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

根据取模的性质,这个方程相当于 \(ax+by=1\),其中 \(y\) 为负数,形式类似于扩展欧几里得的经典形式 \(ax+by=\gcd(a,b)\)。

方程 \(ax+by=m\) 有整数解的必要条件是 \(\gcd(a,b)|m\),此处 \(m=1\),所以有 \(\gcd(a,b)=1=m\)。也就是说方程 \(ax+by=1 \iff ax+by=\gcd(a,b)\),我们可以直接使用扩展欧几里得求解。

假设我们已知一组整数 \(x_1,y_1\) 使得 \(bx_1+(a\bmod b)y_1=\gcd(a,b)\) 成立,则有 \(ax+by=bx_1+(a\bmod b)y_1\) 成立。由取模的性质得,\(ax+by=bx_1+(a-b\cdot\lfloor\dfrac{a}{b}\rfloor)y_1=ay_1+b(x_1+\lfloor\dfrac{a}{b}\rfloor y_1)\),得到一组解 \(x=y_1,y=x_1+\lfloor\dfrac{a}{b}\rfloor y_1\)。这样,只要知道了一组 \(x_1,y_1\),就能够得到一组 \(x,y\)。

那么怎么求 \(x_1,y_1\) 呢?我们发现,定义 \(x_1,y_1\) 的方程 \(bx_1+(a\bmod b)y_1=\gcd(a,b)\) 和 \(ax+by=\gcd(a,b)\) 形式相同,可以用同样的方法,令 \(ax+by=\gcd(a,b)\) 中的 \(a=b,b=a\bmod b\),再去找一组 \(x_2,y_2\) 满足 \(bx_2+(a\bmod b)y_2=\gcd(a,b)\)。知道了 \(x_2,y_2\),就知道了 \(x_1,y_1\)……依此类推。

类似欧几里得算法,递归边界是 \(a=\gcd(a,b),b=0\),又 \(ax_n+by_n=\gcd(a,b)\),所以 \(x_n=1,y_n\) 取任意值(为避免溢出,一般取 \(0\)),递归回去求出一开始的 \(x,y\) 即可。

此时的答案尚不符合题目“最小”的要求,需要进一步处理。设 \(a=m+bn\),\(n\) 极大,于是原方程为 \((m+bn)x+by=1 \iff mx+b(nx+y)=1\) 使得 \(x\) 最小,所以直接 \(x\bmod b\)即可,注意调整范围避免出现负数。

下面是 AC 代码:

void exgcd(int a, int b, int &x, int &y) {
    if (!b) return x = 1, y = 0, void();
    exgcd(b, a % b, y, x);
    y = y - (a / b) * x;
}
//main
exgcd(a, b, x, y);
x = (x % b + b) % b;

THE END

标签:方程,gcd,int,bmod,P1082,ax,同余,bx,NOIP2012
From: https://www.cnblogs.com/th19/p/17912828.html

相关文章

  • P1084 [NOIP2012 提高组] 疫情控制
    题意:H国有$n$个城市,这\(n\)个城市用$n-1$条双向道路相互连通构成一棵树,$1$号城市是首都,也是树中的根节点。H国的首都爆发了一种危害性极高的传染病。当局为了控制疫情,不让疫情扩散到边境城市(叶子节点所表示的城市),决定动用军队在一些城市建立检查点,使得从首都到边境......
  • 【数论】同余 学习笔记
    同余定义费马小定理定理内容:若\(p\)是质数,则有:$\foralla\inZ,a^p\equiva\pmodp$。推论:当\(\gcd(a,p)=1\)时,\(a^{p-1}\equiv1\pmodp\)。裴蜀定理及拓展欧几里德算法裴蜀定理:\(\foralla,b\inZ\),一元二次不定方程\(ax+by=\gcd(a,b)\)有整数......
  • P1084 [NOIP2012 提高组] 疫情控制
    首先军队可以原地不动,时间越多越容易合法,先套上二分。在不回到根的情况下,军队深度肯定越小越好。所以军队能往上移就移,如果能回到根就暂时在根对应的儿子那里驻扎。这个过程用树上倍增优化。做完这一步后,我们找出需要军队驻扎的根的儿子(向下不经过军队就能到达叶子),现在就是要让......
  • P1081 [NOIP2012 提高组] 开车旅行
    题目有点长,一步一步来。预处理出每座城市两人分别会选择的下一座城市用set即可实现。倍增优化DP令\(f_{i,j}\)表示从城市\(j\)出发,行驶\(2^i\)天会到达的城市。令\(ga_{i,j}\)表示从城市\(j\)出发,行驶\(2^i\)天,小A行驶的路程。\(gb_{i,j}\)同理。答案枚......
  • 模数为素数幂的同余方程解法
    本节考虑形如:f(x)=anxn+an-1xn-1+...+a1x1+a0≡0modpk的方程,其中a>=2,p为素数,p不整除a。方程解法步骤:1.求出f(x)≡0modp的解x≡cmodp2.设f(x)≡0modp2 的解为x≡=c+yp2-1求出y,带入解得x的值3.设 f(x)≡0modpk 的解为x≡c+yk-1求出y,带入解得x的值y的......
  • 同余相关
    取余定义:\(a\%b=a-b\left\lfloor\dfrac{a}{b}\right\rfloor\)整除\(a|b\)表示\(a\)能被\(b\)整除,即\(b=a\timesk(k\inZ)\)。同余\(a\equivb\pmodm\)表示\(a\modm=b\modm\)。相当于\(a-b=m\timesk(k\inN)\)。裴属定理内容若\(a\),\(......
  • [NOIP2012 提高组] 开车旅行
    题目描述小AA和小BB决定利用假期外出旅行,他们将想去的城市从11到nn编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市ii的海拔高度为hihi​,城市ii和城市jj之间的距离di,jdi,j​恰好是这两个城市海拔高度之差的绝对值,即di,j=∣h......
  • 同余最短路学习笔记
    今天讲课讲到了同余最短路。简单记一下,防止之后忘了这个坑。同余最短路inoiwiki简介同余最短路,可以用来处理问题:1.「给定n个数,求这些数能拼出多少其他数(选数数量不限)」2.「给n个数,求这些数不能拼出的最大or最小值」3.「至少拼几次才能拼出模k余x的数」。同余最......
  • 同余方程(扩展欧几里得)(C/C++)
    ax%b=1,则a和b的最大公约数一定是1。#include<cstdio>#include<iostream>usingnamespacestd;inta,q;intx,y;voidexgcd(inta,intb){ if(b==0) { x=1; y=0; return;//得到gcd(b,0)时到达边界值 }// else { exgcd(b,a%b); intk=x; x=y; y=k-......
  • 学习笔记:同余
    同余定义设整数\(m\ne0\)。若\(m\mid(a-b)\),称\(m\)为模数(模),\(a\)同余于\(b\)模\(m\),\(b\)是\(a\)对模\(m\)的剩余。记作\(a\equivb\pmodm\)。否则,\(a\)不同余于\(b\)模\(m\),\(b\)不是\(a\)对模\(m\)的剩余。记作\(a\not\equivb\pmodm\)。这......