数学专题笔记

数学专题

注:因为笔者太懒目的在于记录所学所用知识点,且暂时没写完,所以部分定理缺
乏证明,请读者自行思考或去别处了解。

1 数论

1.1 欧几里得定理

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

1.2 裴蜀定理

\(\forall\ a,b \in Z, ab\neq 0,\forall\ x,y \in Z,\gcd(a,b) \mid ax+by\)

$ \forall\ a,b \in Z,\exist\ x,y\in Z\ \tt such\ that$ \(ax+by=\gcd(a,b)\)

1.3 扩展欧几里得

扩展欧几里得 (exgcd) 用于求解 \(ax+by=\gcd(a,b)\) 的一组可行解。

过程:

设:

\(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\dfrac{a}{b}\rfloor\times b)\)

所以 \(ax_1+by_1=bx_2+(a-(\lfloor\dfrac{a}{b}\rfloor\times b))y_2\)

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

所以 \(x_1=y_2,y_1=x_2-\lfloor\dfrac{a}{b}\rfloor y_2\)

\(x_2,y_2\) 不断代入递归求解直至 \(b\)\(0\) 递归 \(x=1,y=0\) 回去求解。

代码如下:

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

时间复杂度为 \(O(\log \min(a,b))\)

1.4 费马小定理

\(p\) 素数,对于任意整数 \(a\) 满足 \(p \nmid a\)\(a^{p-1}\equiv 1\pmod{p}\)

1.5 逆元

对于非零整数 \(a,m\),如果存在 \(ab \equiv 1\pmod{m}\),则称 \(b\)\(a\) 在模 \(m\) 意义下的逆元

逆元也被记作 \(a^{-1} \bmod m\),或者简单记作 \(a^{-1}\)

当且仅当 \(\gcd(a,m)=1\) 时存在逆元,当 \(m\) 为素数时满足所有非其倍数的正整数均存在逆元。

可以转化为线性方程通过扩展欧几里得求解。

当且仅当 \(\gcd(a,m)=1\) 时存在逆元。

\(ab \equiv 1\pmod{m}\)

\(\exist\ x,ab = mx + 1\)

\(ab - mx = 1\)

又因为 \(\gcd(a,m) = 1\)

\(ab - mx = \gcd(a,m)\)

通过扩展欧几里得可以求出逆元 \(b\) 的值。

也可以通过费马小定理求解。

\(a \cdot a^{m-2} = a^{m-1} \equiv 1\pmod{m}\)

此时 \(a^{m-2}\) 为逆元。

线性递推求逆元

对于 \(1 \lt i \lt p\) 的正整数 \(i\) 考虑带余除法:

\(p = \lfloor\dfrac{i}{p}\rfloor \times i + (p\bmod i)\)

\(0 \equiv \lfloor\dfrac{i}{p}\rfloor \times i + (p\bmod i )\pmod{p}\)

两边同时乘以 \(i^{-1} (p\bmod i)\)

\(i^{-1}\equiv-\lfloor\dfrac{i}{p}\rfloor (p\bmod i)^{-1}\pmod{p}\)

可以通过递推求解。

代码:

inv[1]=1;
for(int i=2;i<p;i++){
    inv[i]=(ll)(p-p/i)*inv[p%i]%p;
}

1.6 卢卡斯定理

卢卡斯定理 (Lucas) 用于求解数据规模较大时 \(\dbinom{n}{k} \bmod p\) 的值。

\(p\) 为素数时,有卢卡斯定理:

\(\dbinom{n}{k} \equiv \dbinom{\lfloor n/p\rfloor}{\lfloor k/p\rfloor}\dbinom{n \bmod p}{k \bmod p}\pmod{p}\)

1.7 中国剩余定理

中国剩余定理 (CRT) 用于求解如下形式线性同余方程组(满足 \(b_1,b_2,\dots b_n\) 两两互质):

\(\begin {cases}x\equiv a_1\pmod{b_1}\\ x\equiv a_2\pmod{b_2}\\x\equiv a_3\pmod{b_3}\\ \ \ \ \ \dots \\ x\equiv a_n\pmod{b_n}\end{cases}\)

求出所有模数乘积 \(B = \prod_{i=1}^{n} b_i\)

对于第 \(i\) 个方程,计算 \(m_i = \dfrac{B}{b_i}\)

计算 \(m_i\) 在模 \(b_i\) 意义下的乘法逆元 \(m_i^{-1}\)

计算 \(c_i=m_im_i^{-1}\) (不取模)

方程组模 \(B\) 意义下唯一解即为 \(x = \sum_{i=1}^{k} a_ic_i \pmod {B}\)

证明如下:

  1. 证明方程组在模 \(B\) 意义下唯一

    \(x_1, x_2\) 都是解,则

    \(b_i \mid (x_1 - x_2)\) 对每个 \(i\) 成立。

    \(b_i\) 两两互素 \(\Rightarrow\) 乘积 $B \mid (x_1 - x_2) \Rightarrow x_1 \equiv x_2 \pmod{B} $。

  2. 证明 \(x = \sum_{i=1}^{k} a_ic_i \pmod {B}\) 满足方程组

    对于任意 \(i\)\(j \ne i\)\(m_j \equiv 0\pmod{b_i}\),只剩 \(a_im_i^{-1}m_i\equiv a_i\pmod{b_i}\),满足方程组。

综上 \(x\) 为方程组在模 \(B\) 意义下的的唯一解。

1.8 扩展中国剩余定理

扩展中国剩余定理 (exCRT) 用于解决中国剩余定理但不满足模数两两互质的情况。

考虑将两个同余方程合并为同一个同余方程。

设两个方程为 \(x \equiv a_1\pmod {b_1}\)\(x\equiv a_2\pmod{b_2}\)

转化为不定方程,\(x=b_1p+a_1=b_2q+a_2\),其中 \(p,q\in Z\)

转化为线性二元一次方程:\(b_1p-b_2q=a_2-a_1\)

由于裴蜀定理,如若 \(a_2-a_1\) 不能被 \(\gcd(b_2,b_1)\) 整除时,无解。

若有解,通过扩展欧几里得算法解出一组可行解 \((p,q)\)

则两方程合并为同一方程 \(x\equiv b_1p+a_1\pmod{\operatorname{lcm}(b_1,b_2)}\)

对于多个方程,两两合并即可。

1.9 扩展卢卡斯定理

扩展卢卡斯定理 (exLucas) 用于求解数据规模较大时 \(\dbinom{n}{k} \bmod p\)\(p\) 不为素数的值。

\(p\) 分解质因数得到 \(p=p_1^{r_1}p_2^{r_2}...\)

这样子,我们只需要找出对于每一个 \(i\)\(\dbinom{n}{k} \bmod p_i^{r_i}\) 的值,显然所有的 \(p_i^{r_i}\) 两两互质,所以用中国剩余定理即可得到答案。

问题转化成如何求出组合数对质数幂的模数。

\(\dbinom{n}{k} \bmod P^k\\=\dfrac{n!}{m!(n-m)!}\bmod P^k\)

不一定能够求出 \(m!\)\((n-m)!\) 的逆元,显然不一定互质。

转化成:

\(\dfrac{\dfrac{n!}{P^{g(n)}}}{\dfrac{m!}{P^{g(m)}}\dfrac{(n-m)!}{P^{g(n-m)}}}P^{g(n)-g(m)-g(n-m)} \bmod P^k\)

此处 \(g(x)\) 表示 \(n!\)\(P\) 因子的个数。

然后问题转化成 \(\dfrac{x!}{P^{g(x)}} \bmod P^k\) ,显然对于分母来说除去所有 \(P\) 因子后已与 \(P^k\) 互质,可以求逆元。

\(n!=1 \times 2 \times 3 \times \dots \times n\\=(P \times 2P \times 3P \times \dots \times \lfloor\dfrac{n}{P}\rfloor P )(1 \times 2 \times \dots)\\=P^{\lfloor\frac{n}{P}\rfloor}(\lfloor\dfrac{n}{P}\rfloor)! \prod\limits_{i=1,i\not\equiv 0 \pmod P}^{n} i\)

这里的 \(P^{\lfloor\frac{n}{P}\rfloor}\) 要除掉,但是 \((\dfrac{n}{P})!\) 里面还有因子 \(P\) 也要除掉。

\(f(x)=\dfrac{x!}{P^{g(x)}}\)

根据上面的公式,\(f(n)=f(\lfloor\dfrac{n}{P}\rfloor) \prod\limits_{i=1,i\not\equiv 0 \pmod P}^{n} i\)

我们要求的是 \(f(n) \bmod P^{k}\) 的值,显然这个值在 $ \prod\limits_{i=1,i\not\equiv 0 \pmod P}^{n} i$ 内部是有循环节的。

\(f(n) \equiv f(\lfloor\dfrac{n}{P}\rfloor)(\prod\limits_{i=1,i\not\equiv 0\pmod P}^{P^k})^{\lfloor\frac{n}{P^k}\rfloor}(\prod\limits_{i=P^k\lfloor\frac{n}{P^k}\rfloor,i\not\equiv 0 \pmod P}^{n} i)\pmod {P^k}\)

这样就可以递归 \(O(\log _P n)\) 求出 \(f(n)\) 了,边界 \(f(0) =1\)

原式变为 \(\dfrac{f(n)}{f(n-m)f(m)}P^{g(n)-g(m)-g(n-m)} \pmod {P^k}\)

\(f(m)\)\(f(n-m)\)\(P^k\) 互质,通过扩展欧几里得求逆元。

然后就是求 \(g(x)\),既 \(x!\) 中因子 \(P\) 的数量。

还是这么拆:

\(n!=1 \times 2 \times 3 \times \dots \times n\\=(P \times 2P \times 3P \times \dots \times \lfloor\dfrac{n}{P}\rfloor P )(1 \times 2 \times \dots)\\=P^{\lfloor\frac{n}{P}\rfloor}(\lfloor\dfrac{n}{P}\rfloor)! \prod\limits_{i=1,i\not\equiv 0 \pmod P}^{n} i\)

\(P^{\lfloor\frac{n}{P}\rfloor}\) 中有 \(\lfloor\dfrac{n}{P}\rfloor\)\(P\) 因子,\((\lfloor\dfrac{n}{P}\rfloor)!\) 内部也有 \(P\) 因子数量,\(\prod\limits_{i=1,i\not\equiv 0 \pmod P}^{n} i\) 显然不含 \(P\) 因子。

得出 \(g(n)=g(\lfloor\dfrac{n}{P}\rfloor)+\dfrac{n}{P}\)

也能递归 \(O(\log _P n)\) 求出,边界 \(\forall\ i \lt P,g(i)=0\)

于是对每一个 \(p_i^{r_i}\),有答案:

\(\dbinom{n}{m}\equiv \dfrac{f(n)}{f(m)f(n-m)}P^{g(n)-g(m)-g(n-m)} \pmod {p_i^{r_i}}\)

再用中国剩余定理合并即可得到答案。

代码:

int A[maxn],B[maxn];
void exgcd(int a,int b,int &x,int &y){
	if(b==0){x=1,y=0;return;}
	exgcd(b,a%b,x,y);
	int t=x;
	x=y;
	y=t-a/b*y;
}
int gcd(int a,int b){
	if(b==0)return a;
	return gcd(b,a%b);
}
int lcm(int a,int b){
	return a/gcd(a,b)*b;
}
int inv(int a,int p){
	int x,y;exgcd(a,p,x,y);
	return (x+p)%p;
}
int qpow(int a,int b,int p){
	int res=1;
	while(b){
		if(b&1)res=res*a%p;
		a=a*a%p;
		b>>=1;
	}
	return res;
}
int F(int n,int p,int pk){
	if(n==0)return 1;
	int res=1,rem=1;
	for(int i=1;i<=pk;i++)if(i%p)res=res*i%pk;
	res=qpow(res,n/pk,pk);
	for(int i=n/pk*pk;i<=n;i++)if(i%p)rem=rem*(i%pk)%pk;
	return F(n/p,p,pk)*res%pk*rem%pk;
}
int G(int n,int p){
	if(n<p)return 0;
	return G(n/p,p)+(n/p);
}
int C(int n,int m,int p,int pk){
	int f=F(n,p,pk),f2=inv(F(n-m,p,pk),pk),f3=inv(F(m,p,pk),pk);
	int mt=qpow(p,G(n,p)-G(n-m,p)-G(m,p),pk);
	return f*f2%pk*f3%pk*mt%pk;
}
int exLucas(int n,int m,int p){
	int tot=0,tmp=p;
	for(int i=2;i*i<=p;i++){
		if(tmp%i==0){
			int pk=1;
			while(tmp%i==0){
				tmp/=i;
				pk*=i;
			}
			A[++tot]=pk;
			B[tot]=C(n,m,i,pk);
		}
	}
	if(tmp!=1){
		A[++tot]=tmp;
		B[tot]=C(n,m,tmp,tmp);
	}
	int ans=0;
	for(int i=1;i<=tot;i++){
		int M=p/A[i],Mt=inv(M,A[i]);
		ans=(ans+M*Mt%p*B[i]%p)%p;
	}
	return ans;
}
posted @ 2026-08-05 11:43  AyBestEverBy  阅读(4)  评论(0)    收藏  举报