🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 最大公约数与最小公倍数 ## 求最大公约数 ```C++ // 欧几里得算法 int gcf(int a, int b){ return !b?a:gcf(b,a%b); } ``` ## 求最小公倍数 最小公倍数=数1*数2/最大公约数 ## 二元一次方程整数解 方程 $$ax+by=c(a,b,c  \in Z,\ a,b \neq 0)$$ 存在整数解的充要条件是 $$c\%gcf(a,b)=0$$ . 设 $$(x_0,y_0)$$ 是方程 $$ax+by=gcf(a,b),(a,b  \in Z,\  a,b\neq 0)$$ 的一组整数解,则 $$(\frac{cx_0}{gcf}, \frac{cy_0}{gcf})$$ 为方程 $$ax+by=c$$ 的一组整数解。 设 $$(x^*,y^*)$$ 是方程 $$ax+by=c(a,b \neq 0)$$ 的一组整数解,则方程的通解为 $$(x^*+\frac{b}{gcf}K,y^* -\frac{a}{gcf}K)$$  ```C++ // 求解方程 ax+by=gcf(a,b) ,最后函数返回 gcf int exgcf(int a, int b, int& x, int& y){ if(b==0){ x=1; y=0; return a; } int g=exgcf(a,a%b,x,y); int tmp=x; x=y; y=tmp-a/b*y; return g; } // 求解方程 ax+by=c int solve(int a, int b, int c, int& x, int& y){ int g=exgcf(a,b,x,y); if(c%gcf!=0) return 0; // 无整数解 x=c*x/gcf; y=c*y/gcf; return 1; } ``` ## 同余式求解 同余式 $$ax \equiv c\pmod{m} \ (a,c,m\in Z,\ m\geq 1)$$ 等价于 $$(ax-c)\%m=0$$ ,即存在整数 y ,使得 $$ax+my=c$$ 。 - 若 $$c\%gcf(a,m) \neq 0$$ ,则同余式方程 $$ax \equiv c\pmod{m} \ (a,c,m\in Z,\ m\geq 1)$$ 无解。 - 若 $$c\%gcf(a,m) = 0$$ ,则同余式方程 $$ax \equiv c\pmod{m} \ (a,c,m\in Z,\ m\geq 1)$$ 恰有 $$gcf(a,m)$$ 个模 $$m$$ 意义下不同的解,解为 $$x=x^*+\frac{m}{gcf(a,m)}K$$ ,其中 $$K=0,1,\cdots ,gcf(a,m)-1$$ ,$$x$$ 是方程 $$ax+my=c$$ 的一个解。 ## 乘法逆元求解 已知 $$ab\%m=(a\%m)(b\%m)\%m$$ ,则 $$a/b\%m=?$$ ,其中 $$(a\%b=0)$$ .这里需要用到逆元。  设 $$a,b,m \in Z,\ m>1$$ 且有 $$ab \equiv 1 \pmod{m}$$ ,则称 $$a,b$$ 互为乘法逆元。求解逆元即求解同余式方程 $$ax \equiv 1\pmod{m} \ (a,c,m\in Z,\ m>1)$$ ,且在 $$(0,m)$$ 内有唯一解,实际使用中一般称方程在 $$(0,m)$$ 内的解为 $$a$$ 的逆元。 由此 - 若 $$gcf(a,m) \neq 1$$ ,则 $$a$$ 不存在模 $$m$$ 的逆元。 - 若 $$gcf(a,m) =1$$ ,则存在逆元如下 ```c++ int inverse(int a, int m){ int x, y; int g=exgcf(a,m,x,y); return (x%m+m)%m; } ``` 费马小定理:设 $$m$$ 是素数,$$a$$ 是任意整数且 $$a \not\equiv 0 \pmod{m}$$ ,则 $$a^{m-1} \equiv 1 \pmod{m}$$ 当 $$gcf(a,m) =1$$ 时,逆元等于 $$a^{m-2}\%m$$  ## ChangeLog > 2018.09.04 初稿