[基础数论]不定方程笔记

Posted wonder-land

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[基础数论]不定方程笔记相关的知识,希望对你有一定的参考价值。

前言

在学习本节内容前,最好先学习同余的基本性质以加深理解。

一堆定理

  • 定理1:

\\[a,b,m,n \\in \\mathbb Z,c \\mid a,c \\mid b \\]

\\[c \\mid (ma+nb) \\]

证明:
\\(a=ce,b=cf\\)
代入 \\(ma+nb\\) 再提公因式即可。

  • 定理2:

\\[a,b,c \\in \\mathbb Z \\]

\\[(a+cb,b)=(a,b) \\]

证明:
定理1证明二者公因子相同即可。

  • 定理3:

两个不全为零的整数 \\(a,b\\) 的最大公因子是 \\(a,b\\) 线性组合的最小正整数.

证明:令 \\(d\\)\\(a,b\\) 的线性组合中最小的正整数, \\(d = ma + nb\\) , 其中 \\(m,n\\) 是整数,我们将证明 \\(d \\mid a,d \\mid b\\)

由带余除法,得到 \\(a=dq+r, 0≤r<d\\)

\\(a=dq+r\\)\\(d=ma+nb\\) ,得到 \\(r=a-dq=a-q(ma+nb)=(1-qm)a-qnb\\) .

这就证明了整数 \\(r\\)\\(a,b\\) 的线性组合。因为 \\(0 ≤ r < d\\) ,而 \\(d\\)\\(a,b\\) 的线性组合中最小的正整数,

于是我们得到 \\(r=0\\) (如果 \\(r\\) 不是等于 \\(0\\) ,那意味着 \\(r\\) 才是所有线性组合中最小的正整数,这与 \\(d\\) 是所有线性组合中最小的正整数矛盾),因此 \\(d \\mid a\\) ,同理可得, \\(d \\mid b\\) .

我们证明了 \\(a,b\\) 的线性组合中最小的正整数 \\(d\\)\\(a,b\\) 的公因子,剩下要证的是它是 \\(a,b\\) 的最大公因子,为此只需证明 \\(a,b\\) 所有的公因子都能整除 \\(d\\)

由于 \\(d = ma + nb\\) ,因此如果 \\(c \\mid a\\)\\(c \\mid b\\) ,那么由定理2有 \\(c \\mid d\\) ,因此 \\(d > c\\)

得证。

  • 定理4:

\\(a,b\\) 是正整数,
则所有 \\(a,b\\) 的线性组合构成的集合与所有 \\((a,b)\\) 的倍数构成的集合相同。

证明:由定理1\\(a,b\\) 的线性组合都是 \\((a,b)\\) 倍数。

定理3\\((a,b)\\) 属于线性组合,其倍数显然也属于线性组合。

得证。

  • 定理5:

\\[a,b,c \\in \\mathbb Z , m \\in \\mathbb Z^+ ,d=(c,m) \\]

且有

\\[ac \\equiv bc \\pmod m \\]

\\[a \\equiv b \\pmod m/d \\]

证明:令 \\(ac=km+bc \\to (a-b)c=km\\)

两边同除 \\(d\\) 得到:\\((a-b)(c/d)=k(m/d)\\)

因为 \\((c/d)\\)\\((m/d)\\) 互质,

所以有 \\((m/d) \\mid (a-b)\\)

得到结论:\\(a \\equiv b \\pmod m/d\\)

得证。

  • 推论:

\\[a,b,c \\in \\mathbb Z , m \\in \\mathbb Z^+, (c,m)=1 \\]

且有

\\[ac \\equiv bc \\pmod m \\]

则有

\\[a \\equiv b \\pmod m \\]

  • 定理6:

\\(r_1,r_2,…,r_m\\) 是一个模 \\(m\\) 的完全剩余系,且有正整数 \\(a\\) 满足 \\((a,m)=1\\)

则对任何整数 \\(b\\) 有: \\(ar_1+b,ar_2+b,…,ar_m+b\\) 也是一个模 \\(m\\) 的完全剩余系。

证明:若有 \\(ar_i+b\\)\\(ar_j+b\\) 同余,则有 \\(ar_i\\)\\(ar_j\\) 同余。

定理5推论可得:此时有 \\(r_i\\)\\(r_j\\) 同余,矛盾!

故定理成立。

朴素欧几里得定理

\\[a,b \\in \\mathbb Z \\]

\\[(a,b)=gcd(b,a \\% b) \\]

证明:

\\(a=bq+r\\) ,
\\(r=a-bq\\).

定理2得,
\\(gcd(a,b)=gcd(a-bq,b)=gcd(r,b)=gcd(a\\%b,b)=gcd(b,a\\%b)\\)

扩展欧几里得算法

  • 扩展欧几里得算法就是在朴素欧几里得上求一组未知数 \\((x,y)\\) 的解。

  • 公式推导

对于

\\[ax+by=(a,b) \\]

不妨设 \\(a>b\\)

$(1) b=0 $ 则 \\(x=1,y=0\\).

$(2) a>b>0 $

\\(ax_1+by_1=gcd(a,b)\\)\\(bx_2+(a \\mod b) y_2\\)

朴素欧几里得得:\\(gcd(a,b)=gcd(b,a \\mod b)\\)

所以 \\(ax_1 + by_1 = bx_2 + (a \\mod b)y_2\\)

\\(ax_1 + by_1 = bx_2 + (a - \\lfloor \\fracab \\rfloor *b)y_2\\)

化简得:\\(ax_1 + by_1 = bx_2 + ay_2 - \\lfloor \\fracab \\rfloor *b *y_2\\)

贝祖等式\\(x_1 = y_2 , y_1 = x_2 - \\lfloor \\fracab \\rfloor *y_2\\)

裴蜀定理

\\[a,b \\in \\mathbb Z \\]

则存在

\\[x,y \\in \\mathbb Z,ax+by=(a,b) \\]

证明:由定理3易证。

  • 推论:
    整数 \\(a\\)\\(b\\) 互质,
    当且仅当存在整数 \\(m,n\\) 使得 \\(ma+nb=1\\).

证明:若 \\(ma+nb=1\\) ,由定理3\\((a,b)=1\\) ,易证。

二元一次不定方程

对于一些方程形如

\\[ax+by=c \\]

如果 \\(x = x_0, y = y_0\\) 是方程的一个特解,

那么所有的解可以表示为:

\\(x = x_0 + (b/d)n, y = y_0 - (a/d)n\\) ,其中 \\(n\\) 是整数。

code:

//二元一次不定方程
#include<bits/stdc++.h>
#define int long long
using namespace std;

int G,a,b,c,d,x,y;

void exgcd(int a,int b,int& d,int& x,int& y) 
	if(!b) 
		d=a,x=1,y=0;
		return ;
	
	exgcd(b,a%b,d,x,y);
	int t=x;
	x=y,y=t-a/b*y;
	return ;


signed main() 
	scanf("%lld",&G);
	while(G--) 
		scanf("%lld%lld%lld",&a,&b,&c);
		exgcd(a,b,d,x,y);
		if(c%d!=0) 
			printf("-1\\n");
			continue;
		
		x*=c/d,y*=c/d;
		int mx=b/d,my=a/d,minx=-1,maxx=-1,miny=-1,maxy=-1,t;
		if(x>0) 
			minx=x-(x/mx)*mx;
			int ty=y+(x/mx)*my;
			if(!minx) minx+=mx,ty-=my;
			if(ty>0) maxx=minx+ty/my*mx-mx*(ty%my==0?1:0),t=ty/my+1-(ty%my==0?1:0);
		
		else 
			minx=x+(-x)/mx*mx+mx;
			int ty=y-((-x)/mx+1)*my;
			if(ty>0) maxx=minx+ty/my*mx-mx*(ty%my==0?1:0),t=ty/my+1-(ty%my==0?1:0);
		
		if(y>0) 
			miny=y-(y/my)*my;
			int tx=x+(y/my)*mx;
			if(!miny) miny+=my,tx-=mx;
			if(tx>0) maxy=miny+tx/mx*my-my*(tx%mx==0?1:0);
		
		else 
			miny=y+(-y)/my*my+my;
			int tx=x-((-y)/my+1)*mx;
			if(tx>0) maxy=miny+tx/mx*my-my*(tx%mx==0?1:0);
		
		if(maxx!=-1) printf("%lld %lld %lld %lld %lld\\n",t,minx,miny,maxx,maxy);
		else printf("%lld %lld\\n",minx,miny);
	
	return 0;


多元一次不定方程

对于方程形如

\\[a_1x_1 + a_2x_2 + … + a_nx_n = c \\]

由前文所述,我们知道

\\[a_1x_1 + a_2x_2 = k(a_1,a_2) \\ (k \\in \\mathbb Z) \\]

所以原式就可以换成:

\\[(a_1,a_2)x + a_3x_3 + … + a_nx_n = c \\]

重复以上操作,就可以得到:

\\[(a_1,a_2,…,a_n-1)x + a_nx_n =c \\]

再一层层解回去即可。

code:(仅供参考)

//多元一次不定方程
#include<bits/stdc++.h>
#define int long long
using namespace std;

const int maxn=5+5;

long long n,c,a[maxn],ans[maxn];

void exgcd(int a,int b,int& d,int& x,int& y) 
	if(!b) 
		d=a,x=1,y=0;
		return ;
	
	exgcd(b,a%b,d,x,y);
	int temp=x;
	x=y,y=temp-a/b*y;
	return ;


void f(long long t,int now,int& nc) 
	if(now<n) f(__gcd(t,a[now]),now+1,nc);
	int x,y,d;
	exgcd(t,a[now],d,x,y);
	if(nc%d!=0) 
		printf("-1");
		exit(0);
	
	x*=nc/d,y*=nc/d;
	ans[now]=y;
	if(now==2) ans[now-1]=x;
	nc=t*x;
	return ;


signed main() 
	scanf("%lld%lld",&n,&c);
	for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	f(a[1],2,c);
	for(int i=1;i<=n;i++)
		printf("%lld ",ans[i]);
	return 0;


数论笔记-同余

同余

带余数除法

带余数除法的定义与基本性质

定义 对于整数 \\(a,b\\) ,一定存在整数 \\(q,r\\) 满足 \\(a = bq + r\\) ,其中 \\(r\\)\\(a\\) 同号且 \\(|r| \\in [0,b)\\) ,称 \\(q\\)\\(a\\) 除以 \\(b\\) 的商, \\(r\\)\\(a\\) 除以 \\(b\\) 的余数。

通常我们定义 \\(b\\) 是正整数,但为了和c++语法统一,因此修改了定义。

模运算的定义 \\(a \\bmod b\\) 表示 \\(a\\) 除以 \\(b\\) 的余数 \\(r\\) ,符号和 \\(a\\) 一致,运算优先级同乘除。

\\(m\\) 加法 \\((a+b) \\bmod m\\)

\\(m\\) 减法 \\((a-b) \\bmod m\\)

\\(m\\) 乘法 \\(ab \\bmod m\\)

性质1 \\(a \\bmod b = a - b\\times \\lfloor \\fracab\\rfloor\\)

性质2

\\[\\beginaligned a \\bmod m \\pm b \\bmod m &= (a\\pm b) \\bmod m\\\\ (a \\bmod m) \\cdot (b \\bmod m) &= ab \\bmod m\\\\ (a \\bmod m)^k &= a^k \\bmod m \\endaligned \\]

性质3 \\(a \\bmod n = a\\bmod m = x\\)\\(\\gcd(n,m) = 1\\) ,则 \\(a \\bmod nm = x\\)

模运算加速算法

龟速乘

用于可能爆 long long 数字的乘法取余。

不过一般可以用 __int128 替代了。

时间复杂度 \\(O(\\log b)\\)

空间复杂度 \\(O(1)\\)

const int P = 1e9 + 7;
ll qmul(ll a, ll b) 
    ll ans = 0;
    while (b) 
        if (b & 1) ans = (ans + a) % P;
        b >>= 1;
        a = (a << 1) % P;
    
    return ans;

快速幂

幂取余,\\(a\\) 越大速度越慢。

时间复杂度 \\(O(\\log k)\\)

空间复杂度 \\(O(1)\\)

const int P = 1e9 + 7;
ll qpow(ll a, ll k) 
    ll ans = 1;
    while (k) 
        if (k & 1) ans = ans * a % P;
        k >>= 1;
        a = a * a % P;
    
    return ans;

矩阵快速幂

矩阵幂取余。

时间复杂度 \\(O(n^3 \\log k)\\)

空间复杂度 \\(O(1)\\)

const int P = 1e9 + 7;
struct Matrix 

    int n, m;//不能const,快速幂要复制
    vector<vector<ll>> mat;

    explicit Matrix(int _n):n(_n), m(_n), mat(_n + 1, vector<ll>(_n + 1)) 
        for (int i = 1;i <= n;i++)
            for (int j = 1;j <= m;j++)
                mat[i][j] = i == j;
    //初始化n阶单位矩阵,explicit防止误用类型转换

    Matrix(int _n, int _m):n(_n), m(_m), mat(_n + 1, vector<ll>(_m + 1)) //初始化nxm零矩阵

    friend Matrix operator*(const Matrix &A, const Matrix &B) 
        Matrix ans(A.n, B.m);
        if (A.m != B.n) return ans;
        for (int i = 1;i <= A.n;i++)
            for (int j = 1;j <= B.m;j++)
                for (int k = 1;k <= A.m;k++) //a.m == b.n
                    ans.mat[i][j] = (ans.mat[i][j] + A.mat[i][k] * B.mat[k][j]) % P;
        return ans;
    //矩阵乘法取余

    friend Matrix operator^(Matrix A, ll k) 
        Matrix ans(A.n);//A必须是方阵
        while (k) 
            if (k & 1) ans = ans * A;
            k >>= 1;
            A = A * A;
        
        return ans;
    //快速幂取余

    void output() const 
        for (int i = 1; i <= n; i++) 
            for (int j = 1; j <= m; j++)
                cout << mat[i][j] << \' \';
            cout << \'\\n\';
        
        cout << \'\\n\';
    //输出检测
;

同余的定义与基本性质

定义 若整数 \\(a,b\\)\\(m\\) 相等,则称 \\(a,b\\)\\(m\\) 同余,记作 \\(a \\equiv b \\pmod m\\)

以下讨论均为整数。

性质1(自反性) \\(a \\equiv a \\pmod m\\)

性质2(对称性) \\(a\\equiv b \\pmod m \\iff b \\equiv a \\pmod m\\)

性质3(传递性) \\(a \\equiv b \\pmod m,b \\equiv c \\pmod m \\Rightarrow a \\equiv c \\pmod m\\)

性质4(同加性)

\\[\\beginaligned a \\equiv b \\pmod m &\\iff a \\pm c \\equiv b \\pm c \\pmod m\\\\ a \\equiv b \\pmod m,c \\equiv d \\pmod m &\\iff a \\pm c \\equiv b \\pm d \\pmod m \\endaligned \\]

性质5(同乘性)

\\[\\beginaligned a \\equiv b \\pmod m &\\Rightarrow ac \\equiv bc \\pmod m\\\\ a \\equiv b \\pmod m,c \\equiv d \\pmod m &\\Rightarrow ac \\equiv bd \\pmod m \\endaligned \\]

性质6(同幂性) \\(a \\equiv b \\pmod m \\Rightarrow a^k \\equiv b^k \\pmod m\\) ,其中 \\(k \\geq 0\\)

性质7(特殊同除性) \\(a \\equiv b \\pmod m \\Rightarrow \\dfracad \\equiv \\dfracbd \\pmod \\dfracm\\gcd(m,d)\\) ,其中 \\(d\\) 满足 \\(d \\mid a,d \\mid b\\)

性质8 \\(a \\equiv b \\pmod m,m\' \\mid m \\Rightarrow a \\equiv b \\pmod m\'\\)

性质9 \\(a \\equiv b \\pmod m_i(i = 1,2,\\cdots,n) \\iff a \\equiv b \\pmod M ,M = \\textlcm(m_1,m_2,\\cdots,m_n)\\)

性质10 \\(a \\equiv b \\pmod m \\Rightarrow \\gcd(a,m) = \\gcd(b,m)\\)

同余类与剩余系的定义与基本性质

同余类的定义 对于 \\(a \\in [0,m-1]\\) ,集合 \\(\\a + km\\,k \\in \\Z\\) 的所有数模 \\(m\\) 同余 \\(a\\) ,称这个集合为模 \\(m\\) 的一个同余类 \\(\\overline a\\)

完全剩余系的定义\\(m\\) 的同余类有 \\(m\\) 个,分别为 \\(\\overline 0,\\overline 1,\\cdots ,\\overline m-1\\) ,它们构成了 \\(m\\) 的完全剩余系。

既约剩余系的定义\\(m\\) 的同余类有 \\(\\varphi(m)\\) 个的代表元与 \\(m\\) 互质,它们构成了 \\(m\\) 的既约剩余系(简化剩余系)。

\\(\\varphi(m)\\) 为欧拉函数,下一节会讲到。

性质1\\(S\\) 是模 \\(m\\) 的一个完全剩余系,若 \\(\\gcd(k,m) = 1\\) ,则 \\(S\' = \\x\' \\mid x\' = kx+b,x\\in S \\\\) 也是模 \\(m\\) 的一个完全剩余系。

性质2 设模 \\(m_1\\) 的完全剩余系为 \\(S_1\\) ,模 \\(m_2\\) 的完全剩余系为 \\(S_2\\) ,且 \\(\\gcd(m_1,m_2) = 1\\) ,则模 \\(m = m_1m_2\\) 的完全剩余系为 \\(S = \\x\\mid x = m_2x_1 + m_1x_2,x_1 \\in S_1,x_2 \\in S_2\\\\)

性质3\\(S\\) 是模 \\(m\\) 的一个既约剩余系,若 \\(\\gcd(k,m) = 1\\) ,则 \\(S\' = \\x\' \\mid x\' = kx,x\\in S \\\\) 也是模 \\(m\\) 的一个既约剩余系。

性质4 设模 \\(m_1\\) 的既约剩余系为 \\(S_1\\) ,模 \\(m_2\\) 的既约剩余系为 \\(S_2\\) ,且 \\(\\gcd(m_1,m_2) = 1\\) ,则模 \\(m = m_1m_2\\) 的既约剩余系为 \\(S = \\x\\mid x = m_2x_1 + m_1x_2,x_1 \\in S_1,x_2 \\in S_2\\\\)

推论1(性质4的推论) \\(\\gcd(m_1,m_2) = 1 \\Rightarrow \\varphi(m_1m_2) = \\varphi(m_1)\\varphi(m_2)\\) ,即欧拉函数是积性函数。

性质1的证明:

假设存在 \\(kx_i + b \\equiv kx_j + b \\pmod m\\) ,则 \\(kx_i \\equiv kx_j \\pmod m\\) 。因为 \\(\\gcd(k,m) = 1\\) ,所以 \\(x_i \\equiv x_j \\pmod m\\)\\(x_i,x_j\\) 属于一个同余类,矛盾。综上,得证。

性质2的证明:

假设存在 \\(m_2x_1 + m_1x_2 \\equiv m_2x_1\'+m_1x_2\' \\pmod m\\) ,那么 \\(m_2(x_1-x_1\') \\equiv m_1(x_2\'-x_2) \\pmod m\\) 。因为 \\(m_1 \\mid m\\) ,所以 \\(m_2(x_1-x_1\') \\equiv m_1(x_2\'-x_2) \\equiv 0 \\pmod m_1\\) ,又 \\(\\gcd(m_1,m_2) = 1\\) ,所以 \\(x_1-x_1\' \\equiv 0 \\pmod m_1\\) ,矛盾。综上,得证。

性质3的证明:

根据性质1证明,类似可得 \\(S\'\\) 一定是 \\(m\\) 的一个剩余系,且有 \\(\\varphi(m)\\) 个元素,接下来只需证明任意元素都与 \\(m\\) 互质。

任意 \\(x \\in S\\) ,有 \\(\\gcd(x,m) = 1\\) ,又 \\(\\gcd(k,m) = 1\\) ,所以 \\(\\gcd(kx,m) = 1\\) ,所以 \\(S\'\\) 是模 \\(m\\) 的既约剩余系。

性质4的证明:

根据性质2证明,类似可得 \\(S\\) 一定是模 \\(m\\) 的一个剩余系,且有 \\(\\varphi(m_1)\\cdot\\varphi(m_2)\\) 个元素,但我们并不知道 \\(\\varphi(m_1)\\cdot\\varphi(m_2) = \\varphi(m_1m_2)\\) ,因此我们证明 \\(S\\) 的元素都与 \\(m\\) 互质只能说明 \\(S\\) 是模 \\(m\\) 的既约剩余系的一个子集,我们还需要证明模 \\(m\\) 的既约剩余系是 \\(S\\) 的一个子集。

\\(\\gcd(x_1,m_1) = \\gcd(x_2,m_2) = 1\\) ,又 \\(\\gcd(m_1,m_2) = 1\\) ,因此 \\(\\gcd(m_2x_1,m_1) = \\gcd(m_1x_2,m_2) = 1\\) ,所以 \\(\\gcd(m_2x_1 + m_1x_2,m_1) = \\gcd(m_1x_2+m_2x_1,m_2) = 1\\) ,于是 \\(\\gcd(m_1x_2+m_2x_1,m_1m_2) = 1\\) ,即 \\(S\\) 是模 \\(m\\) 的既约剩余系的子集。

因为 \\(\\gcd(m_1,m_2) = 1\\) ,因此 \\(m_2x_1+m_1x_2\\) 可以表达所有整数。那么令模 \\(m\\) 的既约剩余系的元素为 \\(m_2x_1+m_1x_2\\) ,则 \\(\\gcd(m_2x_1+m_1x_2,m_1m_2) = 1\\) ,因此 \\(\\gcd(m_2x_1+m_1x_2,m_1) = \\gcd(m_2x_1+m_1x_2,m_2) = 1\\) ,所以 \\(\\gcd(m_2x_1,m_1) = \\gcd(m_1x_2,m_2) = 1\\) ,又 \\(\\gcd(m_1,m_2) = 1\\) ,于是 \\(\\gcd(x_1,m_1) = \\gcd(x_2,m_2) = 1\\) ,即模 \\(m\\) 的既约剩余系是 \\(S\\) 的子集。

综上 \\(S\\) 就是模 \\(m\\) 的既约剩余系。

推论1的证明:

由性质4,可得 \\(S\\) 的元素个数是 \\(\\varphi(m_1)\\varphi(m_2)\\) ,而模 \\(m\\) 的既约剩余系的元素个数是 \\(\\varphi(m_1m_2)\\) 。因此,当 \\(\\gcd(m_1,m_2) = 1\\)\\(\\varphi(m_1m_2) = \\varphi(m_1)\\varphi(m_2)\\) ,即欧拉函数是积性函数。

欧拉函数

欧拉函数的定义与基本性质

定义 \\([1,n]\\) 中与 \\(n\\) 互质的个数记作 \\(\\varphi(n)\\)

性质1 \\(\\varphi(p) = p-1\\) ,其中 \\(p\\) 为素数。

性质2 \\(\\varphi(p^k) = p^k - p^k-1\\) ,其中 \\(k\\in \\Z^+\\)\\(p\\) 为素数。

性质3 欧拉函数是积性函数,即 \\(\\gcd(a,b) = 1 \\Rightarrow \\varphi(ab) = \\varphi(a)\\cdot \\varphi(b)\\)

性质4 int 范围内欧拉函数的最大值为 \\(1600\\)

由性质1、2、3可以得到引理:

引理1(欧拉函数的展开式)

\\[\\beginaligned \\varphi(n) &= \\varphi\\bigg( \\prod_i = 1^k p_i^c_i \\bigg)\\\\ &= \\prod_i = 1^k\\varphi (p_i^c_i) \\\\ &= \\prod_i = 1^k (p_i^c_i-p_i^c_i-1)\\\\ &= n\\prod_p\\mid n\\bigg(1-\\frac1p\\bigg) \\endaligned \\]

其中 \\(p\\) 是素数。

欧拉函数的求法

试除法

线性筛求欧拉函数

欧拉函数的其他性质

同余重要定理

费马小定理

欧拉定理

威尔逊定理

二元一次不定方程

二元一次不定方程的定义与基本性质

裴蜀定理

解二元一次不定方程

扩展欧几里得算法

类欧几里得算法

乘法逆元

乘法逆元的定义与基本性质

乘法逆元的求法

费马小定理法

扩展欧几里得法

线性求乘法逆元

线性求阶乘逆元

一元一次同余方程

一元一次同余方程的定义与基本性质

解一元一次同余方程

扩展欧几里得算法

解一元一次同余方程组

中国剩余定理

扩展中国剩余定理

以上是关于[基础数论]不定方程笔记的主要内容,如果未能解决你的问题,请参考以下文章

数论笔记-同余

[蒟蒻修炼计划][学习笔记]数论

数论基础题 费马引理+卡特兰数+Lucas定理+同余方程+扩欧

基础数论笔记

[蒟蒻修炼计划][学习笔记]数论

数学分支(转)