初等数论

· · 算法·理论

如有错误或 $\LaTeX$ 不规范的地方,请在评论区指出 # 1. 整除 ## 1.1. 定义 设 $a,b\in \mathbb{Z},a\ne0$ ,如果 $\exists\ q$ ,使 $aq=b$ ,则 $b$ 能被 $a$ 整除,记作 $a\mid b$ ,否则, $b$ 不能被 $a$ 整除,记作 $a\nmid b

1.2. 性质

1.2.1. 性质1

若 a\mid b,b\mid c ,则 a\mid c

证明:

\begin{aligned}\because&\ a\mid b,b\mid c\\&\text{令}ax=b,by=c(x,y\in \mathbb{Z},x\ne0,y\ne0)\\\therefore&\ axy=c\\\because&\ x,y\in\mathbb{Z}\\\therefore&\ xy\in\mathbb{Z}\\\therefore&\ a\mid c\end{aligned}

1.2.2. 性质2

若 a\mid b,a\mid c ,则有 \forall\ x,y\in\mathbb{Z} ,满足 a\mid(bx+cy)

证明:

\begin{aligned}\because&\ a\mid b,a\mid c\\&\text{令}ax_1=b,ay_1=c(x_1,y_1\in\mathbb{Z},x_1\ne0,y_1\ne0)\\ &\begin{aligned}bx+cy&=ax_1x+ay_1y\\&=a(x_1x+y_1y)\end{aligned}\\\because&\ a\mid a(x_1x+y_1y)\\\therefore&\ a\mid(bx+cy)\end{aligned}

1.2.3. 性质3

若 a\mid b ,则 am\mid bm(m\ne0)

证明:

\begin{aligned}\because&\ a\mid b\\&\text{令}ax=b(x\in\mathbb{Z},x\ne0)\\\therefore&\ amx=bm\\\therefore&\ am\mid bm\end{aligned}

1.2.4. 性质4

若 \forall\ x,y\in\mathbb{Z} 满足 ax+by=1 ,且 a\mid n,b\mid n ,则 ab\mid n

证明:

\begin{aligned}\because&\ a\mid n,b\mid n\\&\text{令}ax_1=n,by_1=n(x_1,y_1\in\mathbb{Z},x_1,y_1\ne0)\\&\begin{aligned}ax+by&=1\\\dfrac{x}{b}+\dfrac{y}{a}&=\dfrac{1}{ab}\\\dfrac{xn}{b}+\dfrac{yn}{a}&=\dfrac{n}{ab}\\\dfrac{by_1x}{b}+\dfrac{ax_1y}{a}&=\dfrac{n}{ab}\\xy_1+x_1y&=\dfrac{n}{ab}\end{aligned}\\\because&\ x,y,x_1,y_1\in\mathbb{Z}\\\therefore&\ xy_1+x_1y\in\mathbb{Z}\\\therefore&\ \dfrac{n}{ab}\in\mathbb{Z}\\\therefore&\ ab\mid n\end{aligned}

1.2.5. 性质5

若 b=dq+c,q\in\mathbb{Z} ,那么 d\mid b 的充要条件为 d\mid c

证明1(若 d\mid b ,则 d\mid c):

\begin{aligned}\because&\ d\mid b\\&\text{令}dk=b(k\in\mathbb{Z},k\ne0)\\\therefore&\ b=dq+c\Longleftrightarrow dk=dq+c\\\therefore&\ d\mid c\end{aligned}

证明2(若 d\mid c ,则 d\mid b):

\begin{aligned}\because&\ d\mid c\\&\text{令}dk=c(k\in\mathbb{Z},k\ne0)\\\therefore&\ b=dq+c\Longleftrightarrow b=d(p+k)\\\therefore&\ d\mid b\end{aligned}

2. 模运算

2.1. 定义

定义:有 \forall\ a,b\in\mathbb{Z},b\ne0 ,求 a\div b 的余数,称 a 模 b ,记作 a\bmod b

2.2. 性质

2.2.1. 性质1

(a+b)\bmod c=(a\bmod c+b\bmod c)\bmod c

2.2.2. 性质2

(a-b)\bmod c=(a\bmod c-b\bmod c)\bmod c

2.2.3. 性质3

(ab)\bmod c=[\ (a\bmod c)\times(b\bmod c)\ ]\bmod c

证明:

\begin{aligned}\text{设}&a\bmod c=m_a,b\bmod c=m_b(m_a,m_b\in\mathbb{Z})\\ \because&\ a\bmod c=m_a,b\bmod c=m_b\\ \text{令}&a=m_a+xs_a,b=m_b+cs_b(s_a,s_b\in\mathbb{Z})\\ &\begin{aligned}(ab)\bmod c&=[\ (m_a+cs_a)(m_b+cs_b)\ ]\bmod c\\&=(m_am_b+cm_as_b+cm_bs_a+c^2s_as_b)\bmod c\\&=(m_am_b)\bmod c\\&=[\ (a\bmod c)\times(b\bmod c)\ ]\bmod c\end{aligned}\end{aligned}

2.2.4. 性质4

属于性质三的一种扩展

(a^b)\bmod c=(a\bmod c)^b\bmod c

2.2.5. 性质5

如果 a\bmod b=c,d\ne0,d\in\mathbb{Z} ,则 (ad)\bmod(bd)=cd

证明:

\begin{aligned}\because&\ a\bmod b=c\\&\text{设}bx+c=a(x\in\mathbb{Z})\\\therefore&\ bx+c=a\Longleftrightarrow bdx+cd=ad\\\therefore&\ (ad)\bmod(bd)=cd\end{aligned}

2.2.6. 性质6

如果 a\bmod b=c,d\mid a,d\mid b ,则 (\dfrac{a}{d})\bmod(\dfrac{b}{d})=\dfrac{c}{d}

证明:

\begin{aligned}\because&\ a\bmod b=c\\&\text{设}bx+c=a(x\in\mathbb{Z})\\\therefore&\ bx+c=a\Longleftrightarrow \dfrac{b}{d}x+\dfrac{c}{d}=\dfrac{a}{d}\\\therefore&\ (\dfrac{a}{d})\bmod(\dfrac{b}{d})=\dfrac{c}{d}\end{aligned}

3. 同余

3.1. 定义

设 m 是给定的 \mathbb{Z}^+ ,若满足 m\mid(a-b) ,则称 a 与 b 对模 m 同余,记作 a\equiv b\pmod{m} ;若满足 m\nmid(a-b) ,则称 a 与 b 对模 m 不同余

如果将定义反过来,如果 a\equiv b\pmod{m} ,则 m\mid(a-b)(即 a\equiv b\pmod{m}\iff m\mid(a-b))

证明1(已知 m\mid(a-b)):

\begin{aligned}\because&\ m\mid(a-b)\\&\text{令}mk=a-b(k\in\mathbb{Z},k\ne0)\\\therefore&\ mk=a-b\Longleftrightarrow mk+b=a\Longleftrightarrow b\bmod m=a\bmod m\\\therefore&\ a\equiv b\pmod{m}\end{aligned}

证明2(已知 a\equiv b\pmod{m}):

\begin{aligned}\because&\ a\equiv b\pmod{m}\\\therefore&\ a\bmod m=b\bmod m\\&\text{令}mx+k=a,my+k=b(x,y,k\in\mathbb{Z})\\&\begin{aligned}a-b&=mx+k-my-k\\&=m(x-y)\\\end{aligned}\\\because&\ m\mid m(x-y)\\\therefore&\ m\mid(a-b)\end{aligned}

3.2. 性质

3.2.1. 性质1

a\equiv a\pmod{m}

3.2.2. 性质2

如果 a\equiv b\pmod{m} ,那么 b\equiv a\pmod{m}

3.2.3. 性质3

如果 a\equiv b\pmod{m} , b\equiv c\pmod{m} ,那么 a\equiv c\pmod{m}

3.2.4. 性质4

如果 a\equiv b\pmod{m} ,那么 (a+c)\equiv(b+c)\pmod{m}

证明:

\begin{aligned}\because&\ a\equiv b\pmod{m}\\&\text{令}mk=a-b(k\in\mathtt{Z})\\&\begin{aligned}mk&=a-b\\&=a+c-b-c\\&=(a+c)-(b+c)\end{aligned}\\\therefore&\ (a+c)\equiv(b+c)\pmod{m}\end{aligned}

3.2.5. 性质5

如果 a\equiv b\pmod{m} ,那么 (a-c)\equiv(b-c)\pmod{m}

证明方法类似于性质3

3.2.6. 性质6

如果 a\equiv b\pmod{m} ,那么 (ac)\equiv(bc)\pmod{m}

证明:

\begin{aligned}\because&\ a\equiv b\pmod{m}\\&\text{令}mk=a-b(k\in\mathtt{Z})\\\therefore&\ mk=a-b\Longleftrightarrow mkc=ac-bc\\\therefore&\ (ac)\equiv(bc)\pmod{m}\end{aligned}

3.2.7. 性质7

如果 a\equiv b\pmod{m},c\mid a,c\mid b,(c,m)=1 ,那么 (\dfrac{a}{c})\equiv(\dfrac{b}{c})\pmod{m}

多说一句: (a,b)=\gcd(a,b)

证明:

\begin{aligned}\because&\ a\equiv b\pmod{m}\\&\text{令}mk=a-b(k\in\mathtt{Z})\\\therefore&\ mk=a-b\Longleftrightarrow m\dfrac{k}{c}&=\dfrac{a}{c}-\dfrac{b}{c}\\\because&\ c\mid a,c\mid b\\\therefore&\ \dfrac{a}{c},\dfrac{b}{c}\in\mathbb{Z}\\\therefore&\ \dfrac{mk}{c}\in\mathbb{Z}\\\because&\ (c,m)=1\\\therefore&\ \dfrac{m}{c}\not\in\mathbb{Z}\\\therefore&\ \dfrac{k}{c}\in\mathbb{Z}\\\therefore&\ \dfrac{a}{c}\equiv\dfrac{b}{c}\pmod{m}\end{aligned}

3.2.8. 性质8

如果 a\equiv b\pmod{m} ,那么 (a^c)\equiv(b^c)\pmod{m}

证明:

\begin{aligned}\because&\ a\equiv b\pmod{m}\\&\text{令}mk=a-b(k\in\mathtt{Z})\\\\&\begin{aligned}mk&=a-b\\mk\times\sum\limits_{i=0}^{c-1}a^ib^{c-i-1}&=(a-b)\times\sum\limits_{i=0}^{c-1}a^ib^{c-i-1}\\mk\times\sum\limits_{i=0}^{c-1}a^ib^{c-i-1}&=a^c-b^c\end{aligned}\\\\\therefore&\ (a^c)\equiv(b^c)\pmod{m}\end{aligned}

另注: a^n-b^n=(a-b)\times\sum\limits_{i=0}^{n-1}a^ib^{n-i-1}

3.2.9. 性质9

如果 a\equiv b\pmod{m},c\equiv d\pmod{m} ,那么 (a+c)\equiv (b+d)\pmod{m}

证明:

\begin{aligned}\because&\ a\equiv b\pmod{m},c\equiv d\pmod{m}\\&\text{令}mx=a-b,my=c-d(x,y\in\mathtt{Z})\\&\begin{aligned}mx+my&=a-b+c-d\\m(x+y)&=a+c-(b+d)\end{aligned}\\\therefore&\ (a+c)\equiv(b+d)\pmod{m}\end{aligned}

3.2.10. 性质10

如果 a\equiv b\pmod{m},c\equiv d\pmod{m} ,那么 (ac)\equiv (bd)\pmod{m}

证明:

\begin{aligned}\because&\ a\equiv b\pmod{m},c\equiv d\pmod{m}\\&\text{令}mx=a-b,my=c-d(x,y\in\mathtt{Z})\\\because&\ mx=a-b,my=c-d\\\therefore&\ mxc=ac-bc,myb=bc-cd\\\therefore&\ mxc+myb=ac-bc+bc-cd\Longleftrightarrow m(xc+yb)=ac-bd \\\therefore&\ (ac)\equiv(bd)\pmod{m}\end{aligned}

3.2.11. 性质11

如果 a\bmod p=x,a\bmod q=x,(p,q)=1 ,那么 a\bmod (pq)=x

证明:

\begin{aligned}\because&\ a\bmod p=x,a\bmod q=x\\&\text{令}pk_1+x=a,qk_2+x=a(k_1,k_2\in\mathbb{Z})\\\therefore&\ pk_1+x=qk_2+x\\\therefore&\ \dfrac{pk_1}{q}=k_2\\\because&\ k_2\in\mathbb{Z}\\\therefore&\ \dfrac{pk_1}{q}\in\mathbb{Z}\\\because&\ (p,q)=1\\\therefore&\ \dfrac{p}{q}\not\in\mathbb{Z}\\\therefore&\ \dfrac{k_1}{q}\in\mathbb{Z}\\\therefore&\ qk_3=k_1\\\therefore&\ pk_1+x=a\Longleftrightarrow pqk_3+x=a\\\therefore&\ a\bmod(pq)=x\end{aligned}

4. 排列组合

咕咕咕

5. 筛法

5.1. 暴力筛

暴力筛,顾名思义,非常暴力的筛法(?

暴力筛是所有筛法的祖先,需要好好掌握

我们知道,一个数的倍数是一个合数,那么,我们可以进行一个遍历,将每一个数的倍数全部标记一遍,剩下的未被标记的就是质数了

#include<cmath>
#include<cstdio>
bool flag[200000005];
int n,ans,maxn;         //ans 用于统计质数数量, maxn 用于记录最大质数
int main(){
    scanf("%d",&n);
    for(int i=2;i<=sqrt(n);i++){            //只需枚举到 sqrt(n) 即可
                                            //原理很简单,假设 n=pq(p<q) ,那么,我们一定会在 p 之前的 q 枚举,而 p 的最大值又是 sqrt(n) ,所以枚举到 sqrt(n) 即可
        if(!flag[i]){           //未被标记,说明是质数
            ans++,maxn=i;           //更新数量和最大值
        }
        for(int j=i+i;j<=n;j+=i){           //将其倍数设为合数
            flag[j]=1;
        }
    }
    for(int i=sqrt(n)+1;i<=n;i++){          //因为遍历到 sqrt(n) 就结束了,后面的素数还要再来一个循环统计一次
        if(!flag[i]){
            ans++;
            maxn=i;
        }
    }
    printf("%d %d",ans,maxn);
    return 0;
}

然而,这显然不是最优筛法

5.2. 埃式筛

我们发现,假设一个合数 n 的其中一个质因子为 k ,那么 n=kx , n 与其倍数必然已经在遍历到 k 的时候标记了,就不用再筛一遍了

所以,我们可以只用筛素数的倍数即可

#include<cmath>
#include<cstdio>
bool flag[200000005];
int n,ans,maxn;
int main(){
    scanf("%d",&n);
    for(int i=2;i<=sqrt(n);i++){
        if(!flag[i]){
            ans++;
            maxn=i;
        }
        if(flag[i]){            //当遍历到素数时,直接跳过,不进行遍历,剩下的和暴力筛一模一样
            continue;
        }
        for(int j=i+i;j<=n;j+=i){
            flag[j]=1;
        }
    }
    for(int i=sqrt(n)+1;i<=n;i++){
        if(!flag[i]){
            ans++;
            maxn=i;
        }
    }
    printf("%d %d",ans,maxn);
    return 0;
}

埃式筛已经够快了,但是,我们还有一个更快的解决方法

5.3. 欧拉筛

在埃式筛中,某些数依旧会被重复标记两次,比如 12 ,既会被 3 标记,也会被 2 标记

这时,我们尽量让每个数只被标记一次

而欧拉筛的原理是让每一个数被它的最小质因数标记

这里先上代码

#include<cstdio>
bool flag[200000005];
int n,ans,maxn;
int num[1500005],len;           //num 数组用于统计素数数组
int main(){
    scanf("%d",&n);
    for(int i=2;i<=n;i++){
        if(!flag[i]){           //遍历到素数
            num[++len]=i,ans++,maxn=i;
        }
        for(int j=1;j<=len&&num[j]*i<=n;j++){           //枚举可能的最小质因数
            flag[num[j]*i]=1;           //标记
            if(i%num[j]==0){            //后文会有详细解释
                break;
            }
        }
    }
    printf("%d %d",ans,maxn);
    return 0;
}

这里解释一下这一段代码:

if(i%num[j]==0){
    break;
}
\begin{aligned}&\text{假设}\ num[\ j\ ]=k\\\because&\ k\mid i\\\therefore&\ i=kx(x\in\mathbb{Z}^+)\\&\text{当枚举到}\ num[\ j+1\ ]=k_1\ \text{时}\\&ik_1=kxk_1\\\because&\ k<k_1\\\therefore&\ k_1\ \text{不是最小质因数}\end{aligned}

显然,这样已经违背了欧拉筛的原理,所以退出

6. gcd/lcm

6.1. 定义

公约数定义:一般设有 k 个数 a_1,a_2,a_3,\cdots,a_k\in\mathbb{Z}^+ ,如果 \exists d\in\mathbb{Z}^+ ,使 d\mid a_1,d\mid a_2,d\mid a_3,\cdots,d\mid a_k ,那么 d 为 a_1,a_2,a_3,\cdots,a_k 的公约数, d 是不唯一的

最大公约数:在 a_1,a_2,a_3,\cdots,a_k 的公约数集合中,最大的那个公约数称为最大公约数,如果是 a,b 两个元素的最大公约数,记为 \gcd(a,b) ,简写为 (a,b)

公因数与最小公因数的定义与公约数与最大公约数的定义类似,注意一下符号即可:

a,b$ 两个元素的最小公因数记为 $\operatorname{lcm}(a,b)$ ,简写为 $[a,b]

6.2. 一个定理

\gcd(a,b)\times\operatorname{lcm}(a,b)=ab

证明:

\begin{aligned}&\text{将}a,b\text{进行质因子分解,设其质因子集合并集为}\{p_1,p_2,\cdots,p_n\} \\&\text{设}a=p_1^{k_1}p_1^{k_2}\cdots p_n^{k_n},b=p_1^{j_1}p_1^{j_2}\cdots p_n^{j_n}(j_i,k_i\in\mathbb{Z},j_i\ge0,k_i\ge0)\\&\because\ \gcd(a,b)=p_1^{\min(k_1,j_1)}p_2^{\min(k_2,j_2)}\cdots p_n^{\min(k_n,j_n)}\\&\operatorname{lcm}(a,b)=p_1^{\max(k_1,j_1)}p_2^{\max(k_2,j_2)}\cdots p_n^{\max(k_n,j_n)}\\&\min(a,b)+\operatorname{lcm}(a,b)=a+b\\&\ \begin{aligned}\therefore\gcd(a,b)\times\operatorname{lcm}(a,b)&=p_1^{\min(k_1,j_1)}p_2^{\min(k_2,j_2)}\cdots p_n^{\min(k_n,j_n)}p_1^{\max(k_1,j_1)}p_2^{\max(k_2,j_2)}\cdots p_n^{\max(k_n,j_n)}\\&=p_1^{\min(k_1,j_1)+\max(k_1,j_1)}p_2^{\min(k_2,j_2)+\max(k_2,j_2)}\cdots p_n^{\min(k_n,j_n)+\max(k_n,j_n)}\\&=p_1^{k_1+j_1}p_2^{k_2+j_2}\cdots p_n^{k_n+j_n}\\&=p_1^{k_1}p_1^{k_2}\cdots p_n^{k_n}p_1^{j_1}p_1^{j_2}\cdots p_n^{j_n}\\&=ab\end{aligned}\end{aligned}

6.3. 欧几里得算法

一种非常常见的求最大公约数的算法:

\gcd(a,b)=\gcd(b,a\bmod b)

代码形式:

#include<cstdio>
int gcd(int a,int b){
    return !b?a:gcd(b,a%b);
}
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    printf("%d",gcd(n,m));
    return 0;
}
//非常简单,应该不用注释了吧

证明一下:

\begin{aligned}&\text{设}\gcd(a,b)=p\\\therefore&\ a=kp,b=gp(\gcd(k,g)=1)\\\therefore&\ a\bmod b=(kp)\bmod(gp)=(k\bmod g)p\\&\begin{aligned}\gcd(b,a\bmod b)&=\gcd(gp,(k\bmod g)p)\\&=p\\&=\gcd(a,b)\end{aligned}\end{aligned}

7. 裴蜀定理

这是一个非常常见的定理,相当重要

7.1. 基本定理

对于不定方程 ax+by=m(a,b,x,y,m\in\mathbb{Z}) ,其有解的充分必要条件为 \gcd(a,b)\mid m

证明1(已知 ax+by=m 有解):

\begin{aligned}\because&\ ax+by=m\text{有解}\\\therefore&\ \exists\ x,y\in\mathbb{Z},\text{满足}ax+by=m\\\because&\ \gcd(a,b)\mid a,\gcd(a,b)\mid b\\\therefore&\ \gcd(a,b)\mid (ax+by)(\text{整除性质2})\\\therefore&\ \gcd(a,b)\mid m\end{aligned}

证明2(已知 \gcd(a,b)\mid m):

咕咕咕

OI 中常见的有关裴蜀定理的出题形式(?

对于 \forall x,y\in\mathbb{Z} ,函数 \operatorname{f}(a,b)=ax+by 的最小 \mathbb{Z}^+ 的取值为 \gcd(a,b)

证明:

\begin{aligned}&\text{设}\ m=ax+by\\&\text{由裴蜀定理得:}\ \gcd(a,b)k=m(k\in\mathbb{Z}^+)\\\because&\ k\ \text{的最小值为}\ 1,\gcd(a,b)\ \text{为定值}\\\therefore&\ m\ \text{的最小值为}\ \gcd(a,b)\end{aligned}

7.2. 引理及推论

7.2.1. 引理1

上台社死后我发现,我换一个表述方式似乎就没什么大问题了QAQ

如果 a,b\in\mathbb{Z}^+,(a,b)=1 ,则 \nexists 小于 b 的 k\in\mathbb{Z}^+ ,满足 b\mid ak

证明:

\begin{aligned}&\text{假设存在小于}\ b\ \text{的}\ k\in\mathbb{Z},\text{满足}b\mid ak\\\therefore&\ ak\ \text{中包含}\ b\ \text{的全部质因子}\\\because&\ (a,b)=1\\\therefore&\ a\ \text{不可能包含} b\ \text{的任何质因子}\\\therefore&\ k\ \text{中包含}\ b\ \text{的全部质因子}\\\therefore&\ k=bx(x\in\mathbb{Z}^+)\\\because&\ b>k\\\therefore&\ \text{矛盾,假设不成立}\end{aligned}

7.2.2. 推论

如果 a,b\in\mathbb{Z}^+,(a,b)=1 ,则 0,a,2a,\cdots,(b-1)a 这些数模 b 的余数互不相同

证明:

\begin{aligned}&\text{假设}\ ai,aj\ \text{模}\ b\ \text{的余数相同}\ (1<j<i<b)\ \text{,即}\ ai\bmod b=aj\bmod b\\\therefore&\ ai\bmod b-aj\bmod b=0\Longleftrightarrow (ai-aj)\bmod b=0\Longleftrightarrow a(i-j)\bmod b=0\\\therefore&\ b\mid a(i-j)(i-j<b)\\\because&\ a,b\in\mathbb{Z}^+,(a,b)=1\\\therefore&\ \nexists\ \text{小于}\ b\ \text{的}\ k\in\mathbb{Z}^+\ \text{,满足}\ b\mid ak\\\therefore&\ \text{矛盾,假设不成立}\end{aligned}

7.2.3. 引理2

如果 (a,b)=1 ,则 \exists\ k\in\mathbb{Z} ,满足 ak\bmod b=1

由推论可以很容易的得到该结论

8. 扩展欧几里得

扩展欧几里得(简称扩欧),是一种算法,一般封装为函数,其函数名为 exgcd

可以在已知 a,b\in\mathbb{Z} 的情况下,求不定方程 ax+by=\gcd(a,b) 的一组整数解,通常情况下用扩欧求得的解满足 xy<0

证明:

\begin{aligned}&\text{设}\ ax_1+by_1=\gcd(a,b),bx_2+(a\bmod b)y_2=\gcd(b,a\bmod b)\\&\text{由欧几里得算法得}\ \gcd(a,b)=\gcd(b,a\bmod b)\\\therefore&\ ax_1+by_1=bx_2+(a\bmod b)y_2\\\because&\ a\bmod b=a-b\left\lfloor\dfrac{a}{b}\right\rfloor\\&\begin{aligned}ax_1+by_1&=bx_2+(a\bmod b)y_2\\&=bx_2+(a-b\left\lfloor\dfrac{a}{b}\right\rfloor)y_2\\&=bx_2+ay_2-b\left\lfloor\dfrac{a}{b}\right\rfloor y_2\\&=ay_2+b(x_2-b\left\lfloor\dfrac{a}{b}\right\rfloor)\end{aligned}\\\therefore&\ \begin{cases}x_1=y_2\\y_1=x_2-b\left\lfloor\dfrac{a}{b}\right\rfloor\\\end{cases}\ \text{是方程}\ ax_1+by_1=\gcd(a,b)\ \text{的一组解,且该组解由}\ (x_2,y_2)\ \text{得来}\\&\text{当第}\ n\ \text{组方程关于}\ \gcd(a,0)\ \text{时,有}\ ax_n+by_n=a\\\therefore&\ \begin{cases}x_n=1\\y_n=\forall \ k\in\mathbb{Z}\end{cases}\ \text{是方程}\ ax_n+by_n=a\ \text{的一组解}\\\therefore&\ \text{可以由解}\ (x_n,y_n)\ \text{得到解}\ (x_1,y_1)\end{aligned}

我们拿这道题来举个例子

8.1. 小练习

我们来处理一下原方程:

\begin{aligned}ax&\equiv1\pmod{b}\\by+1&=ax(y\in\mathbb{Z})\\ax-by&=1\end{aligned}

这样一来,直接套扩欧,再处理一下取值,基本上就没问题了

不 开 long long 见 祖 宗

#include<cstdio>
long long int a,b,c,x,y;
void exgcd(long long int a,long long int b){            //扩欧模板
    if(!b){
        x=1,y=0;
        return;
    }
    exgcd(b,a%b);
    long long int t=x;
    x=y;
    y=t-a/b*y;
}
int main(){
    scanf("%lld%lld",&a,&b);
    exgcd(a,b);
    if(x<0){            //处理结果,保证是最小的正整数
        x=x+(-x/b+1)*b;
    }else{
        x=x-x/b*b;
    }
    printf("%lld",x);           //输出
    return 0;
}
//水

9. 费马小定理

如果 p 为质数,且 a\bmod p\ne0 ,则 a^{p-1}\bmod p=1

证明:

\begin{aligned}\because&\ a(2a)(3a)\cdots[(p-1)a]\bmod p=a^{p-1}\times(p-1)!\bmod p\\\text{又}\ \because&\ p\ \text{为质数,且}\ a\bmod p\ne0\\\therefore&\ \text{由裴蜀定理推论得:}\ a\bmod p,(2a)\bmod p,(3a)\bmod p,\cdots,[(p-1)a]\bmod p\ \text{互不相等,且在区间}\ (0,p)\ \text{内}\\\therefore&\ a(2a)(3a)\cdots[(p-1)a]\bmod p=(p-1)!\bmod p\\\therefore&\ a^{p-1}(p-1)!\equiv(p-1)!\pmod{p}\\\because&\ p\ \text{为质数}\\\therefore&\ ((p-1)!,p)=1\\\therefore&\ a^{p-1}\equiv1\pmod{p}\end{aligned}