首页 > 其他分享 >gcd & exgcd

gcd & exgcd

时间:2024-02-02 21:46:21浏览次数:18  
标签:lfloor frac gcd bmod mid exgcd ax

gcd & exgcd

gcd

设 \(a=bk+c\),显然有 \(c=a \bmod b\)。设 \(d \mid a,~d \mid b\),则 \(c=a-bk, \frac{c}{d}=\frac{a}{d}-\frac{b}{d}k\)。由右边的式子可知\(\frac{c}{d}\) 为整数,即 \(d \mid c\) ,所以对于 \(a,b\) 的公约数,它也会是 \(b,a \bmod b\) 的公约数。反过来也需要证明:设 \(d \mid b,~d\mid (a \bmod b)\),我们还是可以像之前一样得到以下式子 \(\frac{a\bmod b}{d}=\frac{a}{d}-\frac{b}{d}k,~\frac{a\bmod b}{d}+\frac{b}{d}k=\frac{a}{d}\) 。因为左边式子显然为整数,所以 \(\frac{a}{d}\) 也为整数,即 \(d \mid a\),所以 \(b,a\bmod b\) 的公约数也是 \(a,b\) 的公约数。既然两式公约数都是相同的,那么最大公约数也会相同。所以得到式子

exgcd

设 \(ax_1+by_1=\gcd(a,b)\),\(bx_2+(a\bmod b)y_2=\gcd(b,a\bmod b)\)
由欧几里得定理可知: \(\gcd(a,b)=\gcd(b,a\bmod b)\)
所以 \(ax_1+by_1=bx_2+(a\bmod b)y_2\)
又因为 \(a\bmod b=a-(\lfloor\frac{a}{b}\rfloor\times b)\)
所以

\[ax_1+by_1=bx_2+(a-(\lfloor\frac{a}{b}\rfloor\times b))y_2\\ \]

\[ax_1+by_1=ay_2+bx_2-\lfloor\frac{a}{b}\rfloor\times by_2=ay_2+b(x_2-\lfloor\frac{a}{b}\rfloor y_2) \]

因为 \(a=a,b=b\) ,所以 \(x_1=y_2,y_1=x_2-\lfloor\frac{a}{b}\rfloor y_2\)
将 \(x_2,y_2\) 不断代入递归求解直至 \(\gcd\) (最大公约数,下同)为 \(0\) 递归 \(x=1,y=0\) 回去求解。

\[\because ax+by=c\\ \therefore\gcd(a,b)\mid (ax+by)\\ \therefore \text{if}~ \gcd(a,b) \not \mid c\Rightarrow \text{No solution} \]

设 \(x_0,y_0\) 为 \(ax+by=\gcd(a,b)\) 的一组特解。
设 \(x_1=\frac{x_0 c}{\gcd(a,b)}~y_1=\frac{y_0 c}{\gcd(a,b)}\)
则 \(x_1,y_1\) 为 \(ax+by=c\) 的一组特解
设任意 \(d\in Q\) ,那么

\[a(x_1+db)+b(y_1-da)=c \]

同时, \(x_1+db\) 与 \(y_1-da\) 需均为正数。
因为 \(x_1,y_1\in \text{Z}\)
所以我们需要 \(da\in \text{Z},db \in \text{Z}\) 。
当 \(d\) 取到最小可能的正值时 \(d_x=db,d_y=da\) 那么任意解中这两个变量与 \(x_1,y_1\) 的偏差一定分别是 \(d_x\) 和 \(d_y\) 的倍数。
显然最小时 \(d_x=\frac{b}{\gcd(a,b)}\),\(d_y=\frac{a}{\gcd(a,b)}\) ,在 \(d=\frac{1}{\gcd(a,b)}\) 时取到
通解公式

\[x=x_1+s d_x\\ y=y_1-s d_y \]

\(s\) 是任意整数
两条性质:

  1. \(x\) 增大时 \(y\) 减小
  2. \(s\) 越大, \(x\) 越大, \(y\) 越小。

若我们限制 \(x>0\) 有 \(x_1+s d_x>0,s>-\frac{x_1}{d_x}\)
若我们限制 \(y>0\) 有 \(y_1-s d_y>0,s<\frac{y_1}{d_y}\)
所以 \(-\frac{x_1}{d_x}<s<\frac{y_1}{d_y}\)
因为 \(s\) 是整数,故

\[\lceil \frac{-x_1+1}{d_x}\rceil \le s \le \lfloor \frac{y_1-1}{d_y} \rfloor \]

标签:lfloor,frac,gcd,bmod,mid,exgcd,ax
From: https://www.cnblogs.com/lldxjw/p/18004070

相关文章

  • 欧拉函数——gcd问题的一大利器
    定义欧拉函数,即\(\varphi(n)\),表示的是\([1,n]\)内与\(n\)互质的数的个数,如\(\varphi(1)=1\)。若\(n\)是质数,显然\(\varphi(n)=n-1\)。性质欧拉函数是积性函数。若\(\gcd(a,b)=1\),则\(\varphi(a\timesb)=\varphi(a)\times\varphi(b)\)。更特殊......
  • UOJ #33 树上 GCD
    套路地,对每个\(g\in[1,n-1]\)求出有多少对无序对\((u,v)\)满足\(g|f(u,v)\),然后就可以用一个倒序枚举的\(\mathcalO(n\logn)\)的容斥求出答案。考虑点分治,对每个经过分治中心\(c\)的\(u\rightsquigarrow\text{lca}(u,v)\rightsquigarrowv\)只需分两种......
  • CF1174E Ehab and the Expected GCD Problem
    EhabandtheExpectedGCDProblemLuoguCF1174E题目描述\(p\)是一个排列,定义\(f(p)\):设\(g_i\)为\(p_1,p_2,\cdots,p_i\)的最大公因数(即前缀最大公因数),则\(f(p)\)为\(g_1,g_2,\cdots,g_n\)中不同的数的个数。设\(f_{max}(n)\)为\(1,2,\cdots,n\)的所有排......
  • exgcd+乘法逆元相关笔记
    #include<iostream>#include<cstdio>usingnamespacestd;constintpass=0;//exgcd://求解二元一次不定方程//ax+by=(a,b)=(b,a%b)=bx'+(a%b)*y'=bx'+(a-b*(a/b))*y'=b*(x'-(a/b)*y')+ay'//则有y=(x'-(a/b)*y'),x=y'......
  • CF1806F GCD Master 题解
    题目链接EasyversionHardversion题目解法参考DeaphetS的题解很有意思的题,感觉\(F1\)不到\(*2900\),\(F2\)超过\(*2900\)F1简化题目中的操作:把\(n\)个数放到\(n-k\)组中,求\(\max(\sum\)每组\(a_i\)的\(\gcd)\)首先考虑所有数互不相同的情况结论1:把\(k+......
  • exgcd 学习笔记
    定义又名扩展欧几里得算法(辗转相除法)是用来求\(ax+by=gcd(a,b)\)中未知数的算法算法证明拿到一组\(a,b\),设\(G=gcd(a,b)\)目标:求出满足\(ax+by=G(1)\)的\(x\)与\(y\)如果已知一组\(x2,y2\),满足\(bx2+\)\((a\)\(mod\)\(b)y2=G(2)\)此时结合\((1)(2)\)得\(a......
  • iOS GCDWebServer 搭建本地服务器
    需求场景:H5页面读取系统相册,把选中的图片上传给前端H5.(H5不能直接读取沙盒的路径)方案1:读取到的二进制baseEncode字符串形式交互 弊端:安全性问题:JavaScript在浏览器中运行,可能存在潜在的安全风险,需要谨慎处理用户照片,以免导致隐私泄露或安全问题。性能问题:读取大型......
  • CF1900D Small GCD 题解
    原题链接:CF1900D,题意不多赘述。首先可以将\(a\)数组排序,并且枚举中间的那个数\(a_i\)。那么答案就是\(\sum_{j=1}^{i-1}\gcd(a_j,a_i)\times(n-i)\)。重点在于求前面的\(\gcd\)。可以用欧拉反演,但是也可以不用,因为我不会。假设我们当前已经枚举到了\(a_i\),设\(f_k\)表......
  • [ARC124C] LCM of GCDs 题解
    题目跳转Fake_Solution前言[warning]:本题解的做法是错法,但是正确概率贼高。离谱的是正确率还可以叠加。正解是记搜,时间复杂度可以证明。正解看文末。思考众所周知一个公式:\[a\timesb=\operatorname{lcm}(a,b)\times\gcd(a,b)\]如果你不知道——自证吧,不难。于是,移一......
  • CF1900D Small GCD
    Link这是一个需要欧拉反演的题目首先,可以知道只和数字之间的大小有关,数列的顺序无关,那么就可以首先排一个序方便解决该问题。根据欧拉函数的性质,知道\(n=\sum_{d|n}\phi{(n)}\)那么我们每次先确定中间的数\(a_j\),然后根据公式,得他它得贡献是\(\sum_{i=1}^{j-1}gcd(a_{i},a_{j}......