萌新数论笔记

声明

在本文中,

  • \(a\mid b\) 表示 \(b\bmod a=0\)
  • \(a\nmid b\) 表示 \(b\bmod a\not=0\)
  • \(\sum\) 表示求和
  • \(\prod\) 表示求积
  • \(a!\) 表示 \(a\) 的阶乘
  • \(\left\lfloor\dfrac{a}{b}\right\rfloor\) 表示下取整 \(\dfrac{a}{b}\)
  • \(\left\lceil\dfrac{a}{b}\right\rceil\) 表示上取整 \(\dfrac{a}{b}\)
  • \(\gcd(),\operatorname{lcm}()\),分别表示最大公约数和最小公倍数
  • \(a\perp b\)\(\gcd(a,b)=1\)
  • \(a\gets b\) 表示使 \(a\) 变为 \(b\)
  • \(a\in A\) 表示 \(a\) 在集合 \(A\)
  • \(a\notin A\) 表示 \(a\) 不在集合 \(A\)

本文也发布在 我的 blog,但 blog 更新可能会慢一点。

Eazy

同余方程

定义

\(a\bmod m=b\bmod m\),那么称 \(a,b\) 对模 \(m\) 同余,记为 \(a\equiv b\pmod m\)

逆元

\(p\)\(a\) 互质\(ax\equiv 1\pmod p\),则称 \(x\)\(a\) 在模 \(p\) 意义下的逆元,一般记为 \(a^{-1}\)

容易发现,若有 \(0<b<p\)\(a^{-1}\),则对于任意的 \(0<i\le \infty\) 皆有 \(bi\)\(a^{-1}\)。一般所说的逆元为最小的 \(b\)

费马小定理

\(p\) 是与 \(a\) 互质的质数,则有 \(a^{p-1}\equiv 1\pmod p\)

证明

构造数集 \(A=\{1,2,\dots,p-1\}\)

证明:\(\prod_{i=1}^{p-1}a\times A_i\equiv \prod_{i=1}^{p-1}A_i\pmod p\)

若有 \(aA_i\bmod p=aA_j\bmod p=r(1\le i<j\le p-1)\),设 \(aA_i=xp+r,aA_j=yp+r\),两式相减得 \((A_i-A_j)a=(x-y)p\)。由于 \(a,p\) 互质且 \(A_i-A_j<p\) 所以该等式不成立,故每个 \(aA_i\)\(p\) 的值都是独一无二的,又因为余数只有 \(p-1\) 个,故余数集必为 \(A\) 的一个排列,于是 \(\prod_{i=1}^{p-1}a\times A_i\equiv \prod_{i=1}^{p-1}A_i\pmod p\) 得证。

将左边的 \(a\) 提取出来,得 \(a^{p-1}\prod_{i=1}^{p-1}A_i\equiv \prod_{i=1}^{p-1}A_i\pmod p\),化简得 \(a^{p-1}\equiv 1\pmod p\)

费马小定理求逆元

因为有 \(a^{p-1}\equiv p\pmod p\),可得 \(a\times a^{p-2}\equiv p\pmod p\),对比逆元的式子 \(ax\equiv 1\pmod p\) 容易发现 \(x=a^{p-2}\),注意这里的 \(x\) 不一定 \(a\)\(p\) 意义下的最小逆元。

注意到有些非质数的数同样满足该定理,例如 \(341=11\times 13\),这样的数被称为伪素数。

剩余系

剩余类

对于任意的一个数 \(n\),根据 \(a\bmod p\) 的不同,可以把 \(a\) 分为 \(n\) 个剩余类,余数为 \(r\) 的类表示为 \(C_r=xp+r\)

完全剩余系(完系)

\(n\) 的每个剩余类中各取出一个元素,这些元素组成了模 \(n\) 的完系。

简化剩余系(缩系)

对于 \(\varphi(n)\) 个与 \(n\) 互质\(r\),在这 \(\varphi(n)\)\(C_r\) 中各取一个元素,组成了模 \(n\) 的缩系。

这里 \(\varphi(n)\) 是指与 \(n\) 互质且 \(<n\) 的正整数的个数,在 筛法与函数-筛法求欧拉函数 一节详细介绍。

威尔逊定理

\((p-1)!\equiv -1\pmod p\)\(p\) 为质数的 充分必要条件

必要性

\(p\) 为质数。

构造模 \(p\)缩系 \(A=\{1,2,\dots,p-1\}\)

取一个 \(a\in[1,p-1]\),因为 \(a,p\) 互质,故 \(\{a,2a,\dots,ap-a\}\) 也为模 \(p\)缩系,因此只存在一个 \(x\in[1,p-1]\) 使得 \(ax\equiv 1\pmod p\)

  • \(a=x\),则有 \(x^2\equiv 1\pmod p\),因式分解得 \((x+1)(x-1)\equiv 0\pmod p\),因为 \(x,p\) 互质,则 \(x=1\)\(x=p-1\)
  • \(a\not=x\),则有 \(2\le a,x\le p-2\),由于每个 \(a\) 对应着唯一的 \(x\) ,所以有 \(\dfrac{p-2-2+1}{2}=\dfrac{p-3}{2}\)\(a,x\) 使得 \(ax\equiv 1\pmod p\),将所有这样的式子乘起来就能得到 \((p-2)!\equiv 1\pmod p\),两边同乘 \(p-1\)\((p-1)!\equiv 1\pmod p\),即 \((p-1)!\equiv -1\pmod p\)

充分性

\(p\) 为合数。

\(p=1\) 时,\((1-1)!\equiv 0\pmod 1\)

\(p=4\) 时,\((4-1)!\equiv 2\pmod 4\)

\(p>4\) 时,

  • \(p\) 不是完全平方数,构造 \(2\le a<b< p\)
    则有 \((p-1)!=1\times2\times\dots\times a\times\dots\times b\times\dots\times p-1=kp\),有 \((p-1)!\equiv 0\pmod p\)
  • \(p\) 是完全平方数,构造 \(p=k^2\)
    则有 \((p-1)!=1\times2\times\dots\times k\times\dots\times 2k\times\dots\times p-1=kp\),有 \((p-1)!\equiv 0\pmod p\)

推论

\(p\) 为质数,则 \((p-1)!+1\equiv 0\pmod p\)

\(p>4\)\(p\) 为合数,则 \((p-1)!\equiv 0\pmod p\)

e.g. 给定 \(n\),求 \(S=\sum_{p=1}^{n}\left\lfloor\dfrac{(p-1)!+1}{p}-\left\lfloor\dfrac{(p-1)!}{p}\right\rfloor\right\rfloor\)

\(p\) 为质数,则 \(\dfrac{(p-1)!+1}{p}\) 为整数,\(S=1\)

否则 \(\dfrac{(p-1)!+1}{p}=\left\lfloor\dfrac{(p-1)!}{p}\right\rfloor\)\(S=0\)

筛出 \(\in[1,n]\) 的质数即可。

欧拉定理

\(a,m\) 互质,则有 \(a^{\varphi(m)}\equiv 1\pmod m\)

证明

\(k=\varphi(m)\)

构造模 \(m\) 的缩系 \(\{r_1,r_2,\dots,r_k\}\)

因为 \(a,m\) 互质,所以 \(\{ar_1,ar_2,\dots,ar_k\}\) 也是 \(m\) 的一个缩系,则有 \(\prod_{i=1}^k r_i\equiv\prod_{i=1}^k ar_i\equiv a^k\times\prod_{i=1}^k r_i\pmod m\),约去 \(\prod_{i=1}^k r_i\) 可得 \(a^k\equiv 1\pmod m\)

用欧拉定理证费马小定理

\(m\) 为质数时,\(\varphi(m)=m-1\),则有 \(a^{m-1}\equiv 1\pmod m\)

扩展欧拉定理

对于 任意\(a,b,m\),有:

\[a^b\equiv\begin{cases}a^b&b<\varphi(m)\\a^{b\bmod\varphi(m)+\varphi(m)}&b\ge\varphi(m)\end{cases}\pmod m \]

e.g. 模版

观察到 \(b\) 很大,将 \(b\) 降幂后再快速幂即可。

int gphi(int m) {
	long long s=m;
	for(int i=2;i*i<=m;i++) {
		if(m%i==0) {
			s=s/i*(i-1);
			while(m%i==0) m/=i;
		}
	}
	if(m>1) s=s/m*(m-1);
	return s;
}
void cele(int mod) {
	bool fl=false;
	for(int i=0;i<s.size();i++) {
		b=(b*10+(s[i]-'0'));
		if(b>mod) b%=mod,fl=true;
	}
	if(fl) b+=mod;
}
long long qpow(long long a,int b,int mod) {
	long long ans=1;
	while(b) {
		if(b&1) ans=(ans*a)%mod;
		a=(a*a)%mod;
		b>>=1;
	}
	return ans%mod;
}

连续逆元线性求

模版

当前已知 \(1\sim i-1\) 的逆元,要求 \(i(i>1)\) 在模 \(p\) 意义下的逆元。

\(p=ki+r(0\le r<i)\),则有 \(ki+r\equiv 0\pmod p\),两边同乘 \(i^{-1}r^{-1}\)\(kr^{-1}+i^{-1}\equiv 0\pmod p\),移项得 \(i^{-1}\equiv -kr^{-1}\equiv -\left\lfloor\frac{p}{i}\right\rfloor\times (p \bmod i)^{-1}\pmod p\)

于是就求出了 \(i\) 的逆元。

for(int i=2;i<=n;i++) {
	a[i]=((p-p/i)*a[p%i])%p;//注意可能是负数,把 p/i 变为 p-p/i 以去掉负号
	printf("%lld\n",a[i]);
}

不定方程(组)

定义

若未知数的个数大于方程的个数,则该方程(组)被称为不定方程(组)。

不定方程(组)一般有无数个解,所以题目会对未知数有一些约束条件。

裴蜀定理

一定存在 \(x,y\) 满足 \(ax+by=\gcd(a,b)\)

该定理对不定方程是否有整数解做出了一个判定方式。

证明

设取整数 \(x_0,y_0\) 时,\(ax_0+by_0=m\)\(\gcd(a,b)=k\)\(m\) 为满足条件的最小正整数。

现在要证 \(m=k\)

因为 \(x_0,y_0\) 为整数,所以有 \(k\mid ax_0,k\mid by_0\),则 \(k\mid ax_0+by_0\),得 \(k\mid m\) (1)。

\(a=qm+r(0\le r<m)\),则有

\[r=a-qm=a-q(ax_0+by_0)=a-aqx_0-bqy_0=a(1-qx_0)+b(-qy_0) \]

因为 \(qx_0,qy_0\) 均为整数,所以可以使 \(x=1-qx_0,y=-qy_0,r=ax+by\)

由于 \(r<m\)\(m\) 是满足条件的最小正整数,所以 \(r=0,a=qm\),因此 \(m\mid a\),同理得 \(m\mid b\),故 \(m\mid k\) (2)。

综合 (1)(2) 得:\(m=k\) 得证。

简单思考一下可以发现,若 \(ax'+by'=k\times\gcd(a,b)\),则 \(x',y'\),变为原解的 \(k\) 倍即可,故形如 \(ax+by=c\) 的不定方程只要满足 \(c=k\times\gcd(a,b)\) 就有整数解,\(k\) 为整数。

同理可得,\(n\) 个未知数的不定方程 \(\sum_{i=1}^{n} a_ix_i=s\) 满足 \(s=k\times\gcd(a_i)\) 时有整数解。

e.g. 模版

根据上面的结论求出 \(\gcd(\left|A_i\right|)\) 即可。

for(int i=1;i<=n;i++) {
	cin>>a;
	if(a<0) a=-a;
	ans=G(ans,a);
}

扩展欧几里得算法

欧几里得算法

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

没错,就是这个。

从辗转相除法到不定方程

\(ax+by=\gcd(a,b)\) 的整数解。

上面我们已经论证了该方程有整数解,这里使用扩展欧几里得算法求解。

\[\begin{aligned}\gcd(a,b)=\gcd(b,a\bmod b)&=bx_1+(a\bmod b)y_1\\&=bx_1+(a-\left\lfloor\frac{a}{b}\right\rfloor\times b)y_1\\&=ay_1+b(x_1-\left\lfloor\frac{a}{b}\right\rfloor y_1)\\&=ax+by\end{aligned} \]

所以有 \(x=y_1,y=x_1-\left\lfloor\frac{a}{b}\right\rfloor y_1\)

注意到 \(b=0\)\(x=1,y=0\),故递归到下界 \(b=0\) 解决即可得到一组 特解

long long exgcd(long long a,long long b,long long &x,long long &y) {
	if(b==0) {
		x=1,y=0;
		return a;
	}
	long long d,x1,y1;
	d=exgcd(b,a%b,x1,y1);
	x=y1,y=x1-a/b*y1;
	return d;
}

从特解到通解

考虑同时使 \(ax\gets ax+k\)\(by\gets by-k\) 来构造通解。

故有 \(x'=x+k\times\dfrac{b}{\gcd(a,b)},y'=y-k\times\dfrac{a}{\gcd(a,b)}\)

从不定方程到同余方程

\(ax\equiv b\pmod m(0\le b<m)\) 的整数解。

\(ax=-ym+b\),则有 \(ax+ym=b\)。根据裴蜀定理判断该方程是否有整数解,然后用扩展欧几里得计算即可。

e.g. 并非模版

\(m=19260817\)

将同余方程化为 \(bx+ym=a\) 求解即可。

Another Idea:求 \(b^{-1}\),就有 \(bb^{-1}\equiv 1\pmod m\),两边同乘 \(a\)\(b\times(ab^{-1})\equiv a\pmod m\),所以 \(x=ab^{-1}\)

中国剩余定理

模版

即要求

\[\begin{cases}x\equiv a_1\pmod {p_1}\\x\equiv a_2\pmod {p_2}\\\dots\\x\equiv a_n\pmod {p_n}\end{cases} \]

\(x\) 的解。其中 \(m\)两两互质的整数\(0\le p_i<m_i\)

中国剩余定理解法

1.设 \(M=\prod_{i=1}^n m_i\)
2.设 \(c_i=\dfrac{M}{m_i}\)
3.计算 \(c_i\) 在模 \(m_i\) 意义下的逆元 \(c_i^{-1}\)
4.\(x=(\sum_{i=1}^na_ic_ic_i^{-1})\bmod M\)

证明

由于 \((\sum_{i=1}^na_ic_ic_i^{-1})\bmod M\) 对于 \(m_i\) 只是减去了它的若干倍,对余数没有影响,所以只需要证 \(x=\sum_{i=1}^na_ic_ic_i^{-1}\) 使同余方程组成立。

  • \(i\not=j\) 时,因为 \(c_j=\dfrac{M}{m_j}\) 中包含项 \(m_i\),故 \(c_j\equiv 0\pmod {m_i},c_jc_j^{-1}\equiv 0\pmod {m_i}\)
  • \(i=j\) 时,因为 \(c_i=\dfrac{M}{m_i}\) 不含 \(m_i\)\(m\) 两两互质,所以 \(c_i\not\equiv 0\pmod {m_i},c_ic_i^{-1}\equiv 1\pmod {m_i}\)

\(x=(\sum_{i=1}^na_ic_ic_i^{-1})\bmod m_i=a_ic_ic_i^{-1}=a_i,x\equiv a_i\pmod {m_i}\)

long long crt() {
	long long M=1,ans=0;
	for(int i=1;i<=n;i++) M*=m[i];
	for(int i=1;i<=n;i++) {
		long long c=M/m[i],x,y;
		exgcd(c,m[i],x,y);
		ans=(ans+(c*x*a[i])%M)%M;
	}
	return (ans%M+M)%M;
}

扩展中国剩余定理

模版

你猜同余方程的内容为什么会出现在不定方程里。

相较于中国剩余定理,本题 \(m\) 不一定两两互质

扩展中国剩余定理解法

合并同余方程求解。

将前两个同余方程化为 \(x=m_1p+a_1=m_2q+a_2\)。则有 \(m_1p-m_2q=a_2-a_1\)

可以用裴蜀定理判断是否有解,使用扩展欧几里得算法求解。

所以有通解 \(p'=p+\frac{m_2}{\gcd(m_1,m_2)}\),代入得 \(x=m_1p+\frac{m_1m_2}{\gcd(m_1,m_2)}+a_1=\operatorname{lcm}(m_1,m_2)+m_1p+a_1\),将 \(m_1p+a_1\) 视作余数即可将两个同余方程合并为 \(x\equiv m_1p+a_1\pmod{\operatorname{lcm}(m_1,m_2)}\)

合并 \(n-1\) 次即可。正确性显然。

long long mul(long long a,long long b,long long mod) {
	long long ans=0;
    while(b>0) {
        if(b&1) ans=(ans+a)%mod;
        a=(a+a)%mod;
        b>>=1;
    }
    return ans;
}
long long excrt() {
	long long m1,m2,a1,a2;
	m1=m[1],a1=a[1];
	for(int i=2;i<=n;i++) {
		m2=m[i],a2=a[i];
		long long p,q;
		long long d=exgcd(m1,m2,p,q);//注意这里 a2-a1 并非是 gcd(m1,m2)
//		if((a2-a1)%d) return -1;裴蜀定理判断是否有解,这里不用 
		long long k=m2/d,c=(((a2-a1)/d)%m2+m2)%m2;
		p=mul(p,c,k);//a2-a1 是 gcd(m1,m2) 的倍数,这里求出正确的特解
		p=(p%k+k)%k;//保证最小
		a1=m1*p+a1,m1=m1*(m2/d);
		a1%=m1;
	}
	return (a1%m1+m1)%m1;
}

BSGS

模版

BSGS(Baby Step Gaint Step),大步小步算法,用于求解 \(a,p\) 互质 的同余方程 \(a^x\equiv b\pmod p\)

求解方法

由扩展欧拉定理 \(a^x\equiv a^{x\bmod\varphi(p)}\pmod p\)\(a^x\)\(p\) 意义下的最小循环节为 \(\varphi(p)\),由于 \(\varphi(p)<p\),所以可以暴力枚举 \(x=0\sim p\),时间复杂度 \(O(p)\)

\(x=im-j\)\(m=\left\lceil\sqrt n\right\rceil,1\le i\le m,0\le j\le m-1\),显然任意的 \(x\in [0,p]\) 均可被表示出来。

则有 \(a^{im-j}\equiv b\pmod p,(a^m)^i\equiv ba^j\pmod p\)

  • 枚举 \(j\),将 \(\operatorname{key}=ba^j\bmod p,\operatorname{val}=j\) 放入哈希表,若 \(\operatorname{key}\) 重复则用大的 \(j\) 替换小的。
  • 枚举 \(i\),查找是否有 \(\operatorname{key}=(a^m)^i\),有则 \(x=im-j\)

由于 \(i,i\le \left\lceil\sqrt p\right\rceil\),所以时间复杂度为 \(O(\sqrt p)\)。正确性显然。

long long a,b,p;
map<long long,long long> mp;
long long bsgs() {
	long long m=sqrt(p);
	if(m*m!=p) m++;
	mp[b]=0;
	for(long long i=1;i<m;i++) {
		b=(b*a)%p;
		mp[b]=i;
	}
	long long k=1;
	for(int i=1;i<=m;i++) k=(k*a)%p;
	long long i,j,t=1;
	for(i=1;i<=m;i++) {
		t=(t*k)%p;
		if(mp.count(t)) return i*m-mp[t];
	}
	return -1;
}

为什么要求 \(a,p\) 互质

\(a^{im-j}\equiv b\pmod p,(a^m)^i\equiv ba^j\pmod p\) 中,若 \(a,p\) 不互质,则两边同乘 \(0\),后面就没有意义了。

扩展 BSGS

模版

你猜同余方程的内容为什么会出现在不定方程里。

相较于 BSGS,本题 \(a,p\) 不互质。

求解方法

将同余方程 \(a^x\equiv b\pmod p\) 化为 \(a\times a^{x-1}\equiv b\pmod p\),进一步变为不定方程 \(a\times a^{x-1}+py=b\),将 \(a,p\) 视为常数,设 \(d=\gcd(a,p)\),则若 \(d\nmid b\),方程无解,否则将 同余方程 两边同除 \(d\),得 \(\dfrac{a}{d}a^{x-1}\equiv \dfrac{b}{d}\pmod{\dfrac{p}{d}}\),记 \(p'=\dfrac{p}{d}\),若 \(\gcd(a,p')\not=1\) 则继续直到 \(a\perp p'\)。记 \(D=\dfrac{p}{p'}\),共进行了 \(k\) 次,则 \(\dfrac{a^k}{D}a^{x-k}\equiv b\pmod {p'}\),由于有 \(a\perp p'\),所以有 \(\dfrac{a^k}{D}\perp p'\),两边同乘它的逆元后就变为了 BSGS。

long long bsgs(int A) {
	long long m=sqrt(p);
	if(m*m!=p) m++;
	mp[b]=0;
	for(long long i=1;i<m;i++) {
		b=(b*a)%p;
		mp[b]=i;
	}
	long long k=1;
	for(int i=1;i<=m;i++) k=(k*a)%p;
	long long i,j,t=A;//注意这里 t 从 a^k/D 开始
	for(i=1;i<=m;i++) {
		t=(t*k)%p;
		if(mp.count(t)) return i*m-mp[t];
	}
	return -1;
}
long long exbsgs() {
	if(b==1||p==1) return 0;
	long long d,k=0,A=1;
	while(true) {
		d=gcd(a,p);
		if(d==1) break;
		if(b%d) return -1;
		k++,b/=d,p/=d,A=(A*(a/d))%p;
		if(A==b) return k;
	}
	long long ans=bsgs(A);
	if(ans==-1) return -1;
	else return ans+k;//记得算出来的是 x-k 要加 k
}

筛法与函数

筛质数

模版

埃氏筛

从小到大枚举,若当前数未被标记,则为质数,标记其倍数。

void ess(int n) {
	for(int i=2;i<=n;++i) {
    	if(!vis[i]){
      		pr[++cnt]=i;
      		for(int j=i*i;j<=n;j+=i) vis[j]=1;
    	}
  	}
}

欧拉筛

从小到大枚举,若未被标记,则为质数,对 每个数 \(i\) 枚举 \(j\) 到其 最小质因子,标记 \(ij\)

void ols(int n) {
	for(int i=2;i<=n;i++) {
		if(!vis[i]) pr[++cnt]=i;
		for(int j=1;i*pr[j]<=n;j++) {
			vis[i*pr[j]]=1;
			if(i%pr[j]==0) break;
		}
	}
}

筛法求欧拉函数

欧拉函数

欧拉函数即 \(\varphi(n)\),被定义为 \(1\sim n\) 中与 \(n\) 互质的数的个数。

特性:
1.若 \(p\) 是质数,则 \(\varphi(p)=p-1\)
2.若 \(p\) 是质数,则 \(\varphi(p^k)=p^{k-1}\varphi(p)\)(证明:由于 \(p\) 是质数,则 \(1\sim p-1,p+1\sim 2p-1,\dots,p^k-p\sim p^{k}-1\) 均与 \(p\) 互质,共有 \(p^{k-1}\) 节长度为 \(\varphi(p)\) 的区间,故 \(\varphi(p^k)=p^{k-1}\varphi(p)\)
3.积性函数:若 \(p,q\) 互质,则有 \(\varphi(pq)=\varphi(p)\varphi(q)\)(证明参考 剩余系的复合

计算

\(\varphi(n)=n\prod_{i=1}^s\dfrac{p_i-1}{p_i}\)\(s\) 为质因子个数,\(p_i\) 为不同的质因子。证明参考性质 2,3。

试除法找质因子即可。

int gphi(int m) {
	long long s=m;
	for(int i=2;i*i<=m;i++) {
		if(m%i==0) {
			s=s/i*(i-1);
			while(m%i==0) m/=i;
		}
	}
	if(m>1) s=s/m*(m-1);
	return s;
}

筛法计算

\(i\) 是质数,则 \(\varphi(i)=i-1\)

\(i\) 是合数,则 \(i\) 在线性筛中被自己的 最小质因子 筛掉。

\(n\)\(i\) 的最小质因子,\(i=nm\)

  • \(n\mid m\),则 \(m\) 包含 \(i\) 的所有质因子,\(nm\prod_{k=1}^s\dfrac{p_k-1}{p_k}=n\varphi(m)\)
  • \(n\nmid m\),则 \(n,m\) 互质,由性质 1,3,得 \(\varphi(i)=\varphi(n)\varphi(m)=(n-1)\varphi(m)\)
void get_phi(int n) {
	phi[1]=1;
	for(int i=2;i<=n;i++) {
		if(!vis[i]) {
			p[cnt++]=i;
			phi[i]=i-1;
		}
		for(int j=0;i*p[j]<=n;j++) {
			int m=i*p[j];
			vis[m]=1;
			if(i%p[j]==0) {
				phi[m]=p[j]*phi[i];
				break;
			} else phi[m]=(p[j]-1)*phi[i];
		}
	}
}

筛法求莫比乌斯函数

莫比乌斯函数

根据唯一分解定理,有 \(x=\prod_{i=1}^s p_i^{a_i}\),其中 \(p_i\) 为互不相同的质因子,\(s\) 为质因子个数。

则有

\[\mu(x)=\begin{cases}1&x=1\\0&\sum_{i=1}^s a_i\not=s\\(-1)^s&x\not=1,\sum_{i-1}^s a_i=s\end{cases} \]

其中 \(\sum_{i-1}^s a_i=s\) 的条件即 \(x\) 不含相同质因子。

筛法计算

\(i\) 是质数,则 \(\mu(i)=1\)

\(i\) 是合数,则 \(i\) 在线性筛中被自己的 最小质因子 筛掉。

\(n\)\(i\) 的最小质因子,\(i=nm\)

  • \(n\mid m\),则 \(i\) 有两个质因子 \(n\)\(\mu(i)=0\)
  • \(n\nmid m\),则 \(i\)\(m\) 多一个质因子 \(n\)\(\mu(i)=-\mu(m)\)
void get_mu(int n) {
	mu[1]=1;
	for(int i=2;i<=n;i++) {
		if(!vis[i]) {
			p[++cnt]=i;
			mu[i]=-1;
		}
		for(int j=1;i*p[j]<=n;j++) {
			int m=i*p[j];
			vis[m]=1;
			if(i%p[j]==0) {
				mu[m]=0;
				break;
			} else mu[m]=-mu[i];
		}
	}
}

约数相关

根据唯一分解定理,有 \(x=\prod_{i=1}^s p_i^{a_i}\),其中 \(p_i\) 为互不相同的质因子,\(s\) 为质因子个数。

约数和定理

\(x\) 的约数和 \(f(x)=\prod_{i=1}^s\sum_{j=0}^{a_i}p_i^j\)

证明:\(p_i^{a_i}\) 的约数有 \(p_i^0,p_i^1,\dots,p_i^{a_i}\)\((a_i+1)\) 个,约数和为 \(\sum_{j=0}^{a_i}p_i^j\),根据乘法原理 \(x\)\(f(x)=\prod_{i=1}^s\sum_{j=0}^{a_i}p_i^j\) 个约数。

筛法求约数和

\(p_j\)\(i\) 的最小质因子,\(g(i)=\sum_{i=1}^{a_j} p_j^i\)

\(i\) 是质数,则 \(f(i)=g(i)=i+1\)

\(i\) 是合数,则 \(i\) 在线性筛中被自己的 最小质因子 筛掉。

\(i=p_jm\)

  • \(p_j\mid m\),则 \(m\) 的最小质因子也一定是 \(p_j\),但 \(i\)\(p_j\) 的次数要比 \(m\) 多一,故 \(g(i)=g(m)+p_j^{a_j+1},f(i)=f(m)\div g(m)\times g(i)\)
  • \(p_j\nmid m\),则 \(m\) 不包含质因子 \(p_j\)\(g(i)=p_j+1,f(i)=f(m)\times g(i)\)
void get_f(int n) {
	g[1]=f[1]=1;
	for(int i=2;i<=n;i++) {
		if(!vis[i]) {
			p[++cnt]=i;
			g[i]=f[i]=i+1;
		}
		for(int j=1;i*p[j]<=n;j++) {
			intm=i*p[j];
			vis[m]=1;
			if(i%p[j]==0) {
				g[m]=g[i]*p[j]+1;
				f[m]=f[i]/g[i]*g[m];
				break;
			} else {
				g[m]=p[j]+1;
				f[m]=f[i]*g[m];
			}
		}
	}
}

约数个数定理

\(x\) 的约数个数 \(d(x)=\prod_{i=1}^s(a_i+1)\)

证明同约数和定理。

筛法求约数个数

\(a_i\)\(i\) 最小质因子次数。

\(i\) 是质数,则 \(d(i)=2,a_i=1\)

\(i\) 是合数,则 \(i\) 在线性筛中被自己的 最小质因子 筛掉。

\(i\) 的最小质因子是 \(p_j\)\(i=p_jm\)

  • \(p_j\mid m\),则 \(m\) 的最小质因子也一定是 \(p_j\),但 \(i\)\(p_j\) 的次数要比 \(m\) 多一,故 \(a_i=a_m+1,d(i)=d(m)\div(a_i+1)\times(a_m+1)\)
  • \(p_j\nmid m\),则 \(m\) 不包含质因子 \(p_j\)\(a_i=1,d(i)=d(m)\times 2\)
void get_d(int n) {
	d[1]=1;
	for(int i=2;i<=n;i++) {
		if(!vis[i]) {
			p[++cnt]=i;
			a[i]=1;
			d[i]=2;
		}
		for(int j=1;i*p[j]<=n;j++) {
			int m=i*p[j];
			vis[m]=1;
			if(i%p[j]==0) {
				a[m]=a[i]+1;
				d[m]=d[i]/(a[i]+1)*(a[m]+1);
				break;
			} else {
				a[m]=1;
				d[m]=d[i]*2;
			}
		}
	}
}

Hard

矩阵

定义

\(m\)\(n\) 列数组成的数组被称为 \(m\times n\) 矩阵。

一个 \(m\times n\) 矩阵 \(A=\begin{bmatrix}A_{1,1}&A_{1,2}&\dots&A_{1,n}\\A_{2,1}&A_{2,2}&\dots&A_{2,n}\\\vdots&\ddots&\ddots&\vdots\\A_{m,1}&A_{m,2}&\dots&A_{m,n}\end{bmatrix}\)

\(m=n\),则也可以称为 \(n\) 阶方阵。

若一个 \(n\) 阶方阵 \(A\) 满足 \(A_{i,j}=[i=j]\),则称其为 \(n\) 阶单位矩阵。

矩阵加法

只有 同型矩阵 才有加法。

\(A,B\) 均为 \(m\times n\) 矩阵,则 \(A+B=C,C_{i,j}=A_{i,j}+B_{i,j}\)

减法同理。

矩阵乘法

若有两个矩阵 \(A,B\)\(A\)\(m\times p\) 矩阵,\(B\)\(p\times n\) 矩阵,则 \(AB=C\)\(C\)\(m\times n\) 矩阵,\(C_{i,j}=\sum_{k=1}^p A_{i,k}B_{k,j}\)

struct matrix {
	long long c[101][101];
	long long m,n;
	matrix() {
		memset(c,0,sizeof c);
	}
};
matrix operator*(matrix &x,matrix &y) {//重载运算-矩阵乘法
	matrix t;
	for(int i=1;i<=x.m;i++)
		for(int j=1;j<=y.n;j++)
			for(int k=1;k<=x.n;k++)
				t.c[i][j]=(t.c[i][j]+x.c[i][k]*y.c[k][j])%mod;
	t.m=x.m,t.n=y.n;
	return t;
}

发现若 \(I\) 为单位矩阵,\(A\) 为与 \(I\) 同阶的方阵,则 \(AI=A\)

矩阵快速幂

模版

由于矩阵乘法满足结合律,所以可以使用快速幂计算一个矩阵的幂。

类似于普通快速幂。

void qpow(matrix &A,long long k) {//计算 A^k
	matrix res;
	res.m=A.m,res.n=A.n;
	for(int i=1;i<=A.n;i++) res.c[i][i]=1;//构造单位矩阵辅助 
	while(k) {
		if(k&1) res=res*A;
		A=A*A;
		k>>=1;
	}
	A=res; 
}

斐波那契 矩阵加速

题目传送门

将相邻的两项 \(F_n,F_{n-1}\) 记作矩阵 \(\begin{bmatrix}F_{n}&F_{n-1}\end{bmatrix}\),现在需要通过构造一个矩阵 \(A\),使得 \(\begin{bmatrix}F_{n}&F_{n-1}\end{bmatrix}=\begin{bmatrix}F_{n-1}&F_{n-2}\end{bmatrix}\times A\)

观察斐波那契递推公式得 \(F_n=F_{n-1}\times 1+F_{n-2}\times 1,F_{n-1}=F_{n-1}\times 1+F_{n-2}\times 0\),则矩阵 \(A=\begin{bmatrix}1&1\\1&0\end{bmatrix}\)

故有 \(\begin{bmatrix}F_{2}&F_{1}\end{bmatrix}\times \begin{bmatrix}1&1\\1&0\end{bmatrix}^{n-2}=\begin{bmatrix}F_{2}&F_{1}\end{bmatrix}\)

A.m=A.n=2;
A.c[1][1]=A.c[1][2]=A.c[2][1]=1;
qpow(A,k-2);
F.m=F.c[1][1]=F.c[1][2]=1,F.n=2;
F=F*A;

高斯消元求解线性方程组

模版&板中板

线性方程组

\[\begin{cases}a_{1,1}x_{1}+a_{1,2}x_{2}+\dots+a_{1,n}x_n=b_1\\a_{2,1}x_{1}+a_{2,2}x_{2}+\dots+a_{2,n}x_n=b_2\\\dots\\a_{n,1}x_{1}+a_{n,2}x_{2}+\dots+a_{n,n}x_n=b_n\end{cases} \]

改写成矩阵

\[\begin{bmatrix}a_{1,1}&a_{1,2}&\dots&a_{1,n}\\a_{2,1}&a_{2,2}&\dots&a_{2,n}\\\vdots&\ddots&\ddots&\vdots\\a_{n,1}&a_{n,2}&\dots&a_{n,n}\end{bmatrix}\times\begin{bmatrix}x_1\\x_2\\\vdots\\x_n\end{bmatrix}=\begin{bmatrix}b_1\\b_2\\\vdots\\b_n\end{bmatrix} \]

增广矩阵

将系数矩阵和常数矩阵放在一起,构成 \(n\times(n+1)\) 的增广矩阵。

\[\begin{bmatrix}a_{1,1}&a_{1,2}&\dots&a_{1,n}&b_1\\a_{2,1}&a_{2,2}&\dots&a_{2,n}&b_2\\\vdots&\ddots&\ddots&\ddots&\vdots\\a_{n,1}&a_{n,2}&\dots&a_{n,n}&b_n\end{bmatrix} \]

矩阵的初等行变换

1.交换两行
2.将某一行乘上一个 非零的数
3.把某行的若干倍加到另一行上

(其实就是在解多元一次方程组时的消元法)

高斯消元

先看消元结果:

\[\begin{bmatrix}1&a_{1,2}'&\dots&a_{1,n}'&b_1'\\0&1&\dots&a_{2,n}'&b_2'\\\vdots&\ddots&\ddots&\ddots&\vdots\\0&0&\dots&1&b_n'\end{bmatrix} \]

即若 \(i=j\),则 \(a_{i,j}'=1\);若 \(i>j\),则 \(a_{i,j}'=0\)

步骤:
1.枚举 主元(第 \(i\) 次枚举到 \(a_{i,i}\)
2.找到最小的 \(j\) 使得 \(j\ge i\)\(a_{j,i}\not=0\)
3.利用 变换1,交换第 \(i,j\)
4.利用 变换2,使 \(a_{i,i}\gets 1\)
5.利用 变换3,使每个 \(j>i\)\(a_{j,i}\gets 0\),即使第 \(j>i\) 行减去 \(a_{j,i}\) 倍的第 \(i\)

之后从下到上代入即可求解。

bool gsxy() {
	for(int i=1;i<=n;i++) {
		int r=i;
		while(fabs(a[r][i])<eps&&r<n) r++;//找主元
		if(fabs(a[r][i])<eps) return 0;//报告无唯一解
		if(r!=i) swap(a[r],a[i]);//1
		for(int j=n+1;j>=i;j--) a[i][j]/=a[i][i]*1.0;//2注意一定要倒着来
		for(int j=i+1;j<=n;j++) {//3
			for(int k=n+1;k>=i;k--) a[j][k]-=a[j][i]*a[i][k]*1.0;
		}
	}
	for(int i=n-1;i>=1;i--) {//代入
		for(int j=i+1;j<=n;j++) a[i][n+1]-=a[i][j]*a[j][n+1]*1.0;
	}
	return 1;//报告有解
}

无解,无数解,唯一解

若消完 \(n\) 行,则有唯一解。

若消到第 \(i\) 行时,有 \(a_{i,i}=b_{i}=0\),则有无数组解。

若消到第 \(i\) 行时,有 \(a_{i,i}=0,b_{i}\not=0\),则无解。

高斯-约旦消元法

先看消元结果:

\[\begin{bmatrix}a'_{1,1}&0&\dots&0&b_1'\\0&a'_{2,2}&\dots&0&b_2'\\\vdots&\ddots&\ddots&\ddots&\vdots\\0&0&\dots&a'_{n,n}&b_n'\end{bmatrix} \]

即若 \(i\not=j\),则 \(a_{i,j}'=0\)

步骤:
1.枚举 主元
2.找到最小的 \(j\) 使得 \(j\ge i\)\(a_{j,i}\not=0\)
3.利用 变换3,使每个 \(j\not=i\)\(a_{j,i}=0\)

之后就可以得到 \(x_i=\dfrac{b_i'}{a'_{i,i}}\)

bool gsxy() {
	for(int i=1;i<=n;i++) {
		int r=i;
		while(fabs(a[r][i])<eps&&r<n) r++;//找主元
		if(fabs(a[r][i])<eps) return 0;
		if(r!=i) swap(a[r],a[i]);
		for(int j=1;j<=n;j++) {//3
			if(i==j) continue;
			double t=a[j][i]/a[i][i];
			for(int k=i;k<=n+1;k++) a[j][k]-=t*a[i][k];
		}
	}
	for(int i=1;i<=n;i++) a[i][n+1]/=a[i][i];
	return 1;
}

矩阵求逆

模版

对于方阵 \(A\),若存在同阶方阵 \(B\),使得 \(AB=BA=I\),则称 \(B\)\(A\) 的逆矩阵,记为 \(A^{-1}\)。其中 \(I\) 是一个 单位矩阵

高斯-约旦消元法求逆

构造 \(n\times 2n\) 矩阵 \((A,I)\),通过高斯-约旦消元法变为 \((I,B)\),此时 \(B\) 就是 \(A^{-1}\)

注意:若 \((A,I)\),无法使用高斯-撒旦消元法,则矩阵 \(A\) 不可逆。

证明

看作线性方程组的形式 \(AX=I\),两边同乘 \(A^{-1}\),则有 \(IX=A^{-1},X=A^{-1}\),即消元后的 \(B=A^{-1}\)

求模意义下的逆矩阵

1.双重模保证最小且非负
2.除法变为乘逆元,避免除法精度问题
3.逆元用费马小定理求出

bool gsxy() {
	for(int i=1;i<=n;i++) {
		int r=i;
		while(a[r][i]==0&&r<n) r++;
		if(a[r][i]==0) return 0;
		if(r!=i) swap(a[r],a[i]);
		long long x=qpow(a[i][i],mod-2);
		for(int j=1;j<=n;j++) {
			if(i==j) continue;
			long long t=a[j][i]*x%mod;
			for(int k=i;k<=2*n;k++) a[j][k]=(a[j][k]-t*a[i][k]%mod+mod)%mod;
		}
		for(int j=1;j<=2*n;j++) a[i][j]=(a[i][j]*x)%mod;
	}
	return 1;
}

排列组合

在本节中,规定 \(0!=1\)

定义

排列

\(n\) 个不同元素中选取 \(m\) 个组成一种有特定顺序的 排列 的方案数为 \(A_n^m\)\(A(n,m)\)

\(A_n^m=\dfrac{n!}{(n-m)!}(0\le m\le n)\)

\(m>n,A_n^m=0\)

组合

\(n\) 个不同元素中选取 \(m\) 个形成一个 集合 的方案数为 \(C_n^m\)\(C(n,m)\)

\(C_n^m=\dfrac{n!}{m!(n-m)!}(0\le m\le n)\)

\(m>n,C_n^m=0\)

求组合数 递推公式

对于任意的 \(1\le m\le n\),有 \(C_n^m=C_{n-1}^m+C_{n-1}^{m-1}\)

证明

\(n\) 个数中选 \(m\) 个数,

  • 若第 \(n\) 个数不选,则要从 \(n-1\) 个数中选 \(m\) 个,即 \(C_{n-1}^m\)
  • 若第 \(n\) 个数选,则要从 \(n-1\) 个数中选 \(m-1\) 个,即 \(C_{n-1}^{m-1}\)

杨辉三角

杨辉三角形如

\[\begin{aligned}1\\1\ 1\\1\ 2\ 1\\ 1\ 3\ 3\ 1\\\vdots\ \ \vdots\ \ \vdots\ \ \vdots\ \ \vdots\end{aligned} \]

即一个数等于上面两个数的和。

设其第 \(i\)\(j\) 列的数为 \(a_{i,j}\),其中 \(i,j\) 从零开始,则有 \(a_{i,j}=a_{i-1,j}+a_{i-1,j-1}\),和刚刚的递推公式一模一样!所以也有 \(a_{i,j}=C_i^j\)

时间复杂度 \(O(n^2)\)

求模意义下的组合数

\(C_n^m\bmod p\)\(p\) 为质数且 \(p>n,m\)

考虑根据 \(C_n^m=\dfrac{n!}{m!(n-m)!}(0\le m\le n)\) 直接计算 \(C_n^m\)

\(f(x)\)\(x!\pmod p\)\(g(x)\)\((x!)^{-1}\pmod p\),由于 \(p\) 为质数且 \(p>n,m\),所以 \(m,n\)\(p\) 互质,根据费马小定理就有 \(g(x)\equiv(x!)^{-1}\equiv x^{p-2}\pmod p\)

\(f(x)\) 递推,\(g(x)\) 快速幂即可,\(C_n^m\equiv f(n)g(m)g(n-m)\pmod p\)

时间复杂度 \(O(n\log p)\)

void init() {
	f[0]=g[0]=1;
	for(int i=1;i<N;i++) {
		f[i]=(f[i-1]*i)%P;
		g[i]=(g[i-1]*qpow(i,P-2))%P;
	}
}
long long C(long long n,long long m) {
	return ((f[n]*g[m])%P*g[n-m])%P;
}

二项式定理

对于任意的整数 \(x,y,n\),有 \((x+y)^n=\sum_{i=0}^n C_n^ix^iy^{n-i}\)

证明

在一个 \((x+y)\) 中,会拆出一个 \(x\) 和一个 \(y\),那么拆出 \(i\)\(x\) 的情况数就为 \(C_n^i\),这些式子的和为 \(C_n^ix^iy^{n-i}\),总和即 \(\sum_{i=0}^n C_n^ix^iy^{n-i}\)

广义二项式定理

即将二项式定理推广到实数域,即对于任意的实数 \(x,y,\alpha\),有 \((x+y)^\alpha=\sum_{i=0}^\infty C_\alpha^ix^iy^{\alpha-i}\)

其中 \(C_\alpha^i=\dfrac{\alpha(\alpha-1)(\alpha-2)\dots(\alpha-i+1)}{i!}\)

卢卡斯定理

模版

对于 质数 \(p\),且有 \(0\le m\le n\) 时,\(C_n^m\equiv C_{n/p}^{m/p}C_{n\bmod p}^{m\bmod p}\pmod p\)

证明

引理 1:\(C_x^p\equiv 0\pmod p(0<x<p)\)\(p\) 为质数。

证明:\(C_p^x=\dfrac{p!}{x!(p-x)!}=\dfrac{p(p-1)!}{x(x-1)!(p-x)!}=\dfrac{p}{x}C_{p-1}{x-1}\),则有 \(C_p^x\equiv p\times x^{-1}\times C_{p-1}^{x-1}\equiv 0\pmod p\)

引理2:\((1+x)^p\equiv 1+x^p\pmod p\)

证明:由二项式定理:\((1+x)^p=\sum_{i=0}^p C_p^i x^i\),由引理 1,只剩 \(i=0\)\(i=p\) 两项,即 \(1+x^p\)

卢卡斯定理证明:

\(nap+b,m=cp+d\),那么有

\[(1+x)^n\equiv \sum_{i=0}^n C_n^ix^i\pmod p \]

其中 \(x^m\) 系数为 \(C_n^m\),又因为有

\[\begin{aligned}(1+x)^n&\equiv (1+x)^{ap+b}\\&\equiv ((1+x)^p)^a\times(1+x)^b\\&\equiv (1+x^p)^a\times(1+x)^b\\&\equiv \sum_{i=0}^aC_a^i x^{ip}\times\sum_{j=0}^{b}C_b^ix^j\pmod p\end{aligned} \]

\(x^m=x^{cp+d}=x^{cp}\times x^d\) 的系数为 \(C_{a}^{c}C_{b}^{d}\),所以有 \(C_n^m\equiv C_{n/p}^{m/p}C_{n\bmod p}^{m\bmod p}\pmod p\)

\(C_{n\bmod p}^{m\bmod p}\) 直接计算,\(C_{n/p}^{m/p}\) 递归到 \(m=0\) 即可。

时间复杂度 \(O(p\log p+\log_pn)\)

long long C(long long n,long long m) {
	if(m>n) return 0;//注意特判
	else return ((f[n]*g[m])%P*g[n-m])%P;
}
long long lcs(long long n,long long m) {
	if(m==0) return 1;
	else return (lcs(n/P,m/P)*C(n%P,m%P))%P;
}

筛法高精度求组合数

1.筛出 \(1\sim n\) 的质数
2.计算 \(C_n^m=\dfrac{n!}{m!(n-m)!}\) 中质数 \(p\) 的个数,根据唯一分解定理,利用高精度计算答案

\(n!\) 中质因子 \(p\) 的个数 \(s=\dfrac{n}{p}+\dfrac{n}{p^2}+\dfrac{n}{p^3}+\dots\)。除法向下取整。

其实就是在求 \(1\sim n\) 中为 \(p\) 的倍数的数的个数,为 \(p^2\) 倍数的数的个数,为 \(p^3\) 倍数的数的个数……根据乘法原理,其和便为 \(n!\) 中质因子 \(p\) 的个数。

int get(int n,int p) {//n! 中 p 的个数
	int s=0;
	while(n) s+=n/p,n/=p;
	return s;
}
int getps(int n,int m,int p) {//C 中 p 的个数
	return get(n,p)-get(m,p)-get(n-m,p);
}
void mul(int p,int &len) {
	int t=0;
	for(int i=0;i<len;i++) {
		t+=C[i]*p;
		C[i]=t%10;
		t/=10;
	}
	while(t) {
		C[len++]=t%10;
		t/=10;
	}
}

隔板法

一个 trick。

经典应用

隔板法可用于求解线性不定方程整数解的组数与相同元素分组的方案数。

例如在上题中即将 \(g(x)=x^x\bmod 1000\) 分成 \(k\) 组,每组的个数 \(a_i\ge 1\)。使用隔板法将其转化为在 \(g(x)\) 个元素间插入 \(k-1\) 个隔板,则共有 \(g(x)-1\) 个位置可以插入,方案数即为 \(C_{g(x)-1}^{k-1}\)

小推广

若要求 \(b_i\le a_i\) 而并非 \(1\le a_i\) 时,该如何求解?

可以令 \(a_i'=a_i-b_i+1\),则有 \(1\le a_i'\),此时 \(\sum_{i=1}^k a_i'=g(x)-\sum_{i=1}^k b_i+k\),利用隔板法求解得方案数为 \(C_{g(x)-\sum_{i=1}^k b_i+k-1}^{k-1}\)

容斥

这节很短但很抽象。

一些定义

集合

集合为由一个或多个确定的不同元素所构成的整体,若有一个集合 \(S\),则 \(S\) 的大小被表示为 \(\left|S\right|\),即其中有 \(\left|S\right|\) 个元素。

一个集合还可以记为 \(\{x\mid \operatorname{condition}\}\),即所有满足条件 \(\operatorname{condition}\)\(x\) 组成的集合。

子集

\(S\) 中包含 \(A\) 的所有元素,则称 \(A\)\(S\) 的一个子集,记为 \(A\subseteq S\)

集合的并

两个集合 \(A,B\) 的并被记作 \(C=A\cup B\),集合 \(C\) 中的任意元素都在 \(A\) \(B\) 中,故还可以记为 \(A\cup B=\{x\mid x\in A\operatorname{or} x\in B\}\)

多个集合 \(S_{1\sim n}\) 的并可以记为 \(\bigcup_{i=1}^n S_i\)

集合的交

两个集合 \(A,B\) 的交被记作 \(C=A\cap B\),集合 \(C\) 中的任意元素都在 \(A\) \(B\) 中,故还可以记为 \(A\cap B=\{x\mid x\in A\operatorname{and} x\in B\}\)

多个集合 \(S_{1\sim n}\) 的交可以记为 \(\bigcap_{i=1}^n S_i\)

集合的差

有两个集合 \(A,B\),属于 \(A\) 但不属于 \(B\) 的元素组成的集合 \(C=A\setminus B\),还可以记为 \(A\setminus B=\{x\mid x\in A\operatorname{and} x\notin B\}\)

\(C\) 同时也是 \(B\)相对补集,记作 \(C=\overline{B}\)。特别地,若 \(B\subseteq A\),则 \(C\)\(B\)绝对补集。下文中若无特殊声明,补集均指绝对补集。

其它

由于有时集合较多,所以符号 \(\sum\) 会被简化,如 \(\sum_{i<j<k}^n\) 其实是 \(\sum_{i=1}^n\sum_{j=i+1}^n\sum_{k=j+1}^n\),又如 \(\sum_{a_i<a_{i+1}(1\le i<m)}^n\) 其实是 \(\sum_{a_1=1}^n\sum_{a_2=a_1+1}^n\sum_{a_3=a_2+1}^n\dots\sum_{a_m=a_{m-1}+1}^n\)

容斥原理 Test 1

若有集合 \(S_{1\sim n}\),则有

\[\left|\bigcup_{i=1}^n S_i\right|=\sum_i^n \left|S_i\right|-\sum_{i<j}^n \left|S_i\cap S_j\right|+\sum_{i<j<k}^n \left|S_i\cap S_j\cap S_k-\right|-\dots+(-1)^{n-1}\left|\bigcap_{i=1}^nS_i\right| \]

\[\left|\bigcup_{i=1}^n S_i\right|=\sum_m^n(-1)^{m-1}\sum_{a_i<a_{i+1}(1\le i<m)}^n\left|\bigcap_{i=1}^m S_{a_i}\right| \]

意义:集合的并等于集合的交的交错和(交错和即一加一减,奇正偶负)。

简略证明

对于在 \(k\) 个集合 \(S_i\) 中的元素 \(x\)
1.在 \(m=1\) 时被加上 \(k\)
2.在 \(m=2\) 时被减去 \(C_k^2\) 次(在 \(k\) 个集合中选择两个)
3.在 \(m=3\) 时被加上 \(C_k^3\)
……
之后在 \(m=k\) 时被加上 \(C_k^k\)
\(m>k\),不再考虑。

\(x\) 被选中的次数 \(c_x=\sum_i^n(-1)^{i-1} C_k^i\)

由二项式定理,\((1-1)^k=\sum_{i=0}^n(-1)^{i} C_k^i=1-c_x\),即 \(1-c_x=0,c_x=1\),即每个元素被选了 \(1\) 次,因此最终并集的大小即为集合的交的交错和。

容斥原理 Test 2

若有 \(S_i\subseteq U\),则有

\[\left|\bigcap_{i=1}^n S_i\right|=\left|U\right|-\left|\bigcup_{i=1}^n \overline{S_i}\right| \]

意义:集合的交等于全集减去补集的并。

很好理解,补集的并中的任意元素任何一个子集中都没有,故用全集减去任何一个子集中都没有的元素即为这些集合的交。

补集的并可以按 容斥原理 Test 1 中的方法计算。

e.g. 简单运用

容斥,先完全背包算出不限硬币时的方案数(全集),再减去不合法方案数(补集的交),哪种硬币超过了可以通过二进制状态枚举,若二进制下 \(a\) 的第 \(i\) 位为一则第 \(i\) 种硬币超过了,这样 \(a\) 枚举 \(1\sim 15\) 即可。

时间复杂度 \(O(sp+np2^p)\),其中 \(p=4\)

void init() {//多重背包
	f[0]=1;
	for(int i=1;i<=M;i++) {
		for(int j=c[i];j<N;j++) {
			f[j]+=f[j-c[i]];
		}
	}
}
long long calc() {//容斥
	long long ans=0,t,fl;
	for(int i=1;i<1<<M;i++) {//状态枚举
		t=0,fl=-1;
		for(int j=0;j<M;j++) {
			if(i&(1<<j)) {
				t+=(d[j+1]+1)*c[j+1];
				fl=-fl;
			}
		}
		if(s>=t) ans+=f[s-t]*fl;
	}
	return f[s]-ans;
}

卡特兰数

以在平面直角坐标系上移动为例,要求任何时刻 \(y\ge0\),且每次只能将坐标变为 \((x+1,y+1)\)\((x+1,y-1)\),求到达 \((2n,0)\) 的路径总数。答案就是卡特兰数 \(H_n\)

通项公式 1

\(H_n=C_{2n}^n-C_{2n}^{n-1}\)

证明:

考虑容斥,除去限制一后,显然到达 \((2n,0)\) 需要进行将坐标变为 \((x+1,y+1)\) 的操作 \(n\) 次,方案数即 \(C_{2n}^n\)。接下来考虑不合法的方案数。将第一次 \(y=-1\) 时的点标出来并作 \(x\) 轴的平行线,将之后的线沿这条线镜像翻转,由于 \((2n,0)\) 沿这条线镜像翻转的结果为 \((2n,-2)\),所以整条操作后的线路对应着一条到达 \((2n,-2)\) 的路径,即需要进行将坐标变为 \((x+1,y+1)\) 的操作 \(n-1\) 次,方案数为 \(C_{2n}^{n-1}\)。所以合法路径总数为 \(H_n=C_{2n}^n-C_{2n}^{n-1}\)

通项公式 2

\(H_n=\dfrac{1}{n+1} C_{2n}^n\)

证明:

\[\begin{aligned}H_n&=C_{2n}^n-C_{2n}^{n-1}\\&=\dfrac{(2n)!}{n!n!}-\dfrac{(2n)!}{(n+1)!(n-1)!}\\&=\dfrac{(2n)!}{n!(n-1)!n}-\dfrac{(2n)!}{n!(n-1)!(n+1)}\\&=\dfrac{(2n)!}{n!(n-1)!}(\dfrac{1}{n}-\dfrac{1}{n+1})\\&=\dfrac{(2n)!}{n!(n-1)!}\dfrac{1}{n(n+1)}\\&=\dfrac{(2n)!}{n!n!(n+1)}\\&=\dfrac{1}{n+1}C_{2n}^n\end{aligned} \]

e.g. 经典应用

显然是卡特兰数,输出 \(H_n\) 即可。

生成函数

定义

某个序列 \(a\) 的生成函数是一个 形式幂级数,而它每一项的系数可以提供关于这个序列的信息。

普通生成函数

\(F(x)=\sum_{0\le i} a_ix^i\)\(x^i\) 基本没有作用,一般只关心 \(a_i\)

其中,\(i\) 对于有限数列是有上限的,对于无限数列则没有。

e.g. 卡特兰数的构造函数 \(F(x)=\sum_{0\le i} H_ix^i\)

加减运算

\(F(x)\pm G(x)=\sum_{0\le i} a_ix^i\pm\sum_{0\le j} b_jx^j=\sum_{0\le k} (a_k\pm b_k)x^k\)

也就是说,\(F(x)\pm G(x)\) 的结果是序列 \(c_k=a_k\pm b_k\) 的指数生成函数。

乘法(卷积)

\(F(x)G(x)=\sum_{0\le i} a_ix^i\sum_{0\le j} b_jx^j=\sum_{0\le i+j} x^{i+j}\sum_{l=0}^{i+j} a_lb_{i+j-l}\)

也就是说,\(F(x)G(x)\) 的结果是序列 \(c_{i+j}=\sum_{l=0}^{i+j} a_lb_{i+j-l}\) 的普通生成函数。

e.g. 有 \(n\) 种物品,每种有 \(a_i\) 个,求选 \(m\) 个的 组合数

设第 \(i\) 种选 \(b_i\) 个,\(0\le b\le a_i,\sum_{i=1}^n b_i=m\),则当 \(b_i\) 确定时,\(i\) 种物品由于物品种类相同,所以选法唯一。

则第 \(i\) 种选择方案数的序列 \(c\) 的普通生成函数 \(F_i(x)=\sum_{i=0}^{a_i} c_ix^i\)\(x^i\) 表示选 \(i\) 个),则有 \(\prod_{i=1}^n F_i(x)\) 的结果中 \(x^m\)(即选 \(m\) 个)的系数即为答案。

指数生成函数

\(F(x)=\sum_{0\le i} a_i\dfrac{x^i}{i!}\)

e.g. 序列 \(1,p,p^2,\dots\) 的指数生成函数为 \(F(x)=\sum_{0\le i} p^i\dfrac{x^i}{i!}=e^{px}\)

加减运算

\(F(x)\pm G(x)=\sum_{0\le i} a_i\dfrac{x^i}{i!}\pm\sum_{0\le j} b_j\dfrac{x^j}{j!}=\sum_{0\le k} (a_k\pm b_k)\dfrac{x^k}{k!}\)

也就是说,\(F(x)\pm G(x)\) 的结果是序列 \(c_k=a_k\pm b_k\) 的指数生成函数。

乘法运算(卷积)

\(F(x)G(x)=\sum_{0\le i} a_i\dfrac{x^i}{i!}\sum_{0\le j} b_j\dfrac{x^j}{j!}=\sum_{0\le i+j}x^{i+j}\sum_{k=0}^{i+j} a_kb_{i+j-k}\dfrac{1}{k!(i+j-k)!}=\sum_{0\le i+j}\dfrac{x^{i+j}}{(i+j)!}\sum_{k=0}^{i+j} a_kb_{i+j-k}\dfrac{(i+j)!}{k!(i+j-k)!}=\sum_{0\le i+j}\dfrac{x^{i+j}}{(i+j)!}\sum_{k=0}^{i+j} a_kb_{i+j-k}C_{i+j}^k\)

也就是说,\(F(x)G(x)\) 的结果是序列 \(c_{i+j}=\sum_{k=0}^{i+j} a_kb_{i+j-k}C_{i+j}^k\) 的指数生成函数。

e.g. 有 \(n\) 种物品,每种有 \(a_i\) 个,求选 \(m\) 个的 排列数

设第 \(i\) 种选 \(b_i\) 个,\(0\le b\le a_i,\sum_{i=1}^n b_i=m\),则当 \(b_i\) 确定时,排列数即为 \(\dfrac{m!}{\prod_{i=1}^nb_i!}\)

则第 \(i\) 种选择方案数的序列 \(c\) 的指数生成函数 \(F_i(x)=\sum_{i=0}^{a_i} c_i\dfrac{x^i}{i!}\)\(x^i\) 表示选 \(i\) 个),则有 \(\prod_{i=1}^n F_i(x)\) 的结果中 \(\dfrac{x^m}{m!}\)(即选 \(m\) 个)的系数乘 \(m!\) 即为答案。

做乘法,\(\prod_{i=1}^{n}\dfrac{x^{b_i}}{b_i!}=\dfrac{x^m}{\prod_{i=1}^n b_i!}=\dfrac{m!}{\prod_{i=1}^n b_i!}\times \dfrac{x^m}{m!}\),卷积求满足的项的系数和就行。

泰勒展开与生成函数

如果不会泰勒展开,请出门左转至 泰勒展开

e.g. 拯救世界

从上到下的生成函数分别为:

\(\sum_{0\le i}[6\mid i]\times x^i=\sum_{0\le i} x^{6i}=\dfrac{1}{1-x^6}\)

\(\sum_{i=0}^9 x^i=\dfrac{1-x^{10}}{1-x}\)

\(\sum_{i=0}^5 x^i=\dfrac{1-x^{6}}{1-x}\)

\(\sum_{0\le i}[4\mid i]\times x^i=\sum_{0\le i} x^{4i}=\dfrac{1}{1-x^4}\)

\(\sum_{i=0}^7 x^i=\dfrac{1-x^{8}}{1-x}\)

\(\sum_{0\le i}[2\mid i]\times x^i=\sum_{0\le i} x^{2i}=\dfrac{1}{1-x^2}\)

\(\sum_{i=0}^1 x^i=\dfrac{1-x^{2}}{1-x}\)

\(\sum_{0\le i}[8\mid i]\times x^i=\sum_{0\le i} x^{8i}=\dfrac{1}{1-x^8}\)

\(\sum_{0\le i}[10\mid i]\times x^i=\sum_{0\le i} x^{10i}=\dfrac{1}{1-x^{10}}\)

\(\sum_{i=0}^3 x^i=\dfrac{1-x^{4}}{1-x}\)

这几个生成函数的卷积为 \(\dfrac{1}{(1-x)^5}\),答案即为 \(x^n\) 的系数 \(C_{n+4}^4\),高精度(虽然但是很恶心)求出即可。

狄利克雷生成函数

\(F(x)=\sum_{0\le i} \dfrac{a_i}{i^x}\)

乘法运算(并非卷积)

\(F(x)G(x)=\sum_{0\le i} \dfrac{a_i}{i^x}\sum_{0\le j} \dfrac{b_j}{j^x}=\sum_{0\le k} \dfrac{1}{k^x}\sum_{d\mid k} a_db_{\frac{n}{d}}\)

\(F(x)G(x)\)\(c_k=\sum_{d\mid k} a_db_{\frac{n}{d}}\) 的狄利克雷生成函数。

其中 \(\sum_{d\mid k}\) 表示枚举满足 \(d\mid k\)\(d\)

筛法与函数 Plus

这里是 筛法与函数 Plus 版。

定义

积性函数

若函数 \(f(x)\) 满足对于 互质\(a,b\),有 \(f(ab)=f(a)f(b)\),则 \(f(x)\) 为积性函数。

任意\(a,b\) 均满足 \(f(ab)=f(a)f(b)\),则 \(f(x)\) 为完全积性函数。

对于任何的积性函数 \(f(x)\) 都有 \(f(1)=1\),易证。

加性函数

若函数 \(f(x)\) 满足对于 互质\(a,b\),有 \(f(ab)=f(a)+f(b)\),则 \(f(x)\) 为加性函数。

任意\(a,b\) 均满足 \(f(ab)=f(a)+f(b)\),则 \(f(x)\) 为完全加性函数。

对于任何的加性函数 \(f(x)\) 都有 \(f(1)=0\),易证。

等价性

\(f(x)\) 相当于 \(g(x)\),则可以记 \(f(x)\Leftrightarrow g(x)\),表示 \(f(x)\)\(g(x)\) 等价。

卷积

两个函数的卷积 \(f(x)g(x)\) 记为 \((f\times g)(x)\),若是函数 \(f(x)\) 自卷积,也可记为 \(f(x)f(x)=(f\times f)(x)=f^2(x)\)

欧拉函数 Plus

我们已在 筛法与函数-筛法求欧拉函数 看到过它。

性质

\(\sum_{d\mid x}\varphi(d)=x\)

证明

  • \(x=1\) 时,易证。
  • \(x\) 为质数时,\(d\) 只能为 \(1\)\(x\),又有 \(\varphi(1)=1,\varphi(x)=x-1\),故 \(\sum_{d\mid x}\varphi(d)=x\) 成立。
  • \(x\) 为合数且不为 \(1\) 时,不妨构造 \(x\) 个分数 \(\dfrac{1\sim x}{x}\),化简后分母只有 \(x\) 的因数,且由于分子和分母互质,所以以因数 \(d\) 为分母的分数有且仅有 \(\varphi(d)\) 个,又因为共有 \(x\) 个分数,所以 \(\sum_{d\mid x}\varphi(d)=x\) 成立。

莫比乌斯函数 Plus

我们已在 筛法与函数-筛法求莫比乌斯函数 看到过它。

性质

\(\sum_{d\mid x}\mu(d)=[x=1]\)

\(x\) 为一时,\(\sum_{d\mid x}\mu(d)=1\),否则 \(\sum_{d\mid x}\mu(d)=0\)

证明

  • \(x=1\) 时,易证。
  • \(x\not= 1\) 时,根据唯一分解定理,有 \(x=\prod_{i=1}^s p_i^{a_i}\),由于在 \(x\) 有相同质因子时 \(\mu(x)=0\),因此可以构造 \(x'=\prod_{i=1}^sp_i\) 使得 \(\sum_{d\mid x}\mu(d)=\sum_{d\mid x'}\mu(d)\)。则:
    • 不含质因子的 \(d\)(即 \(1\))有 \(C_s^0\) 个,\(\mu(d)\) 为正;
    • 含一个质因子的 \(d\)\(C_s^1\) 个,\(\mu(d)\) 为负;
    • 含两个质因子的 \(d\)\(C_s^2\) 个,\(\mu(d)\) 为正;
    • \(\dots\)
  • 于是 \(\sum_{d\mid x'}\mu(d)=\sum_{i=0}^s(-1)^s C_s^i\),由二项式定理,\(\sum_{i=0}^s(-1)^s C_s^i=(1-1)^s=0\)

与欧拉函数的联系

\(\sum_{d\mid x}\mu(d)\dfrac{x}{d}=\varphi(x)\)

证明

  • \(x=1\) 时,易证。
  • \(x\not= 1\) 时,同上文构造 \(x'=\prod_{i=1}^sp_i\) 使得 \(\sum_{d\mid x}\mu(d)\dfrac{x}{d}=\sum_{d\mid x'}\mu(d)\dfrac{x'}{d}=x'\sum_{d\mid x'}\dfrac{\mu(d)}{d}\)。又有 \(x'\sum_{d\mid x'}\dfrac{\mu(d)}{d}=x(1-(\dfrac{1}{p_1}+\dfrac{1}{p_2}+\dots)+(\dfrac{1}{p_1p_2}+\dfrac{1}{p_2p_3}+\dots)-\dots)\)(这步即通过 \(\mu(d)\) 的定义判断 \(\dfrac{\mu(d)}{d}\) 的正负性),因式分解得 \(x(1-(\dfrac{1}{p_1}+\dfrac{1}{p_2}+\dots)+(\dfrac{1}{p_1p_2}+\dfrac{1}{p_2p_3}+\dots)-\dots)=x'\prod_{i=1}^s1-\dfrac{1}{p_i}\),即 \(\varphi(x)\)

狄利克雷卷积

定义

对于两个 积性函数 \(f(x),g(x)\),有

\[(f\times g)(x)=\sum_{d\mid x} f(d)g(\dfrac{x}{d}) \]

易证。

常见积性函数

元函数 \(\varepsilon(x)=[x=1]\)

常数函数 \(1(x)=1\)

恒等函数 \(id(x)=x\)

常见卷积关系

1.\(\sum_{d\mid x}\mu(x)=[x=1]\Leftrightarrow (\mu\times 1)(x)=\varepsilon(x)\)
2.\(\sum_{d\mid x}\varphi(x)=x\Leftrightarrow (\varphi\times 1)(x)=id(x)\)
3.\(\sum_{d\mid x}\mu(d)\dfrac{x}{d}=\varphi(x)=n\Leftrightarrow (\mu\times id)(x)=\varphi(x)\)
4.对于任意积性函数 \(f\),有 \((f\times \varepsilon)(x)=f(x)\)

证明考虑狄利克雷卷积即可,此处省略。

和式的变换

和式即类似 \(\sum_{k\in K} a_k\) 的形式的式子。

这里设 \(n<m\)

替换条件式

\(\sum_{i=1}^n\sum_{j=1}^m\sum_{\gcd(i,j)\mid d} d=\sum_{i=1}^n\sum_{j=1}^m\sum_{d=1}^n [d\mid i][d\mid j]d\)

容易理解,若 \(i,j\) 均整除 \(d\),则 \(d\) 至少包含 \(i,j\) 的一个公因数,即 \(\gcd(i,j)\mid d\)

替换指标变量

\(\sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)=d]=\sum_{id=1}^n\sum_{jd=1}^m [\gcd(id,jd)=d]\)

\(\sum_{id=1}^n\)\(\sum_{jd=1}^m\) 都是在枚举 \(d\) 的倍数,故当 \(i,j\) 互质时,\(\gcd(id,jd)=d\)

交换求和顺序

\(\sum_{i=1}^n\sum_{j=1}^m F(i)G(j)=\sum_{j=1}^m\sum_{i=1}^n F(i)G(j)\)

易证。

分离变量

\(\sum_{i=1}^n\sum_{j=1}^m F(i)G(j)=\sum_{j=1}^m F(i)\sum_{i=1}^n G(j)\)

证明考虑乘法交换律。

莫比乌斯反演

定义

对于两个 积性函数 \(f(x),g(x)\),有

\[f(x)=\sum_{d\mid x} g(d)\Leftrightarrow g(x)=\sum_{d\mid x}\mu(d)f(\dfrac{x}{d}) \]

\(f(x)\)\(g(x)\) 的莫比乌斯变换,\(g(x)\)\(f(x)\) 的莫比乌斯逆变换。

证明

\(f(x)=\sum_{d\mid x}g(x)1(\dfrac{x}{d})=(g\times 1)(x),g(x)=\sum_{d\mid x}\mu(d)f(\dfrac{x}{d})=(\mu\times f)(x)\)(狄利克雷卷积)。

若左式成立,有 \(f(x)=(g\times 1)(x)\),则 \(g(x)=(\mu\times f)(x)=(\mu\times g\times 1)(x)=((\mu\times 1)\times g)(x)=(\varepsilon\times g)(x)=g(x)\),即右式也成立;

若右式成立,有 \(g(x)=(\mu\times f)(x)\),则 \(f(x)=(g\times 1)(x)=(\mu\times f\times 1)(x)=((\mu\times 1)\times f)(x)=(\varepsilon\times f)(x)=f(x)\),即左式也成立。

应用

e.g. 题目传送门

即给定 \(n,m\),求 \(\sum_{i=1}^n\sum_{j=1}^m \operatorname{lcm}(i,j)\pmod{20101009}\)

开始推式子。

不妨钦定 \(n<m\)

原式即 \(\sum_{i=1}^n\sum_{j=1}^m\dfrac{ij}{\gcd(i,j)}\),将 \(\gcd(i,j)\) 单独拎出来,得

\[\sum_{i=1}^n\sum_{j=1}^mij\sum_{d=1}^n\dfrac{[\gcd(i,j)=d]}{d} \]

交换求和顺序,则有 \(\sum_{d=1}^n\sum_{i=1}^n\sum_{j=1}^mij\dfrac{[\gcd(i,j)=d]}{d}\),替换指标变量,得

\[\sum_{d=1}^n\sum_{id=1}^n\sum_{jd=1}^mijd^2\dfrac{[\gcd(id,jd)=d]}{d} \]

由整除分块得

\[\sum_{d=1}^n\sum_{i=1}^{\left\lfloor\dfrac{n}{d}\right\rfloor}\sum_{j=1}^{\left\lfloor\dfrac{m}{d}\right\rfloor}ijd[\gcd(i,j)=1] \]

\(\gcd(i,j)\) 代入 \(\sum_{k\mid x}\mu(x)=[x=1]\) 中,得

\[\sum_{k\mid \gcd(i,j)}\mu(\gcd(i,j))=[\gcd(i,j)=1] \]

代入上式,得

\[\sum_{d=1}^n\sum_{i=1}^{\left\lfloor\dfrac{n}{d}\right\rfloor}\sum_{j=1}^{\left\lfloor\dfrac{m}{d}\right\rfloor}ijd\sum_{k\mid \gcd(i,j)}\mu(k) \]

替换条件式,得

\[\sum_{d=1}^n\sum_{i=1}^{\left\lfloor\dfrac{n}{d}\right\rfloor}\sum_{j=1}^{\left\lfloor\dfrac{m}{d}\right\rfloor}ijd\sum_{k=1}^{\left\lfloor\dfrac{n}{d}\right\rfloor}\mu(k)[k\mid i][k\mid j] \]

交换求和顺序并分离变量,得

\[\sum_{d=1}^nd\sum_{k=1}^{\left\lfloor\dfrac{n}{d}\right\rfloor}\mu(k)\sum_{i=1}^{\left\lfloor\dfrac{n}{d}\right\rfloor}i[k\mid i]\sum_{j=1}^{\left\lfloor\dfrac{m}{d}\right\rfloor}j[k\mid j] \]

替换指标变量,得

\[\sum_{d=1}^nd\sum_{k=1}^{\left\lfloor\dfrac{n}{d}\right\rfloor}\mu(k)\sum_{ik=1}^{\left\lfloor\dfrac{n}{d}\right\rfloor}ik\sum_{jk=1}^{\left\lfloor\dfrac{m}{d}\right\rfloor}jk \]

整除分块并分离变量,得

\[\sum_{d=1}^nd\sum_{k=1}^{\left\lfloor\dfrac{n}{d}\right\rfloor}\mu(k)k^2\sum_{ik=1}^{\left\lfloor\dfrac{n}{dk}\right\rfloor}i\sum_{jk=1}^{\left\lfloor\dfrac{m}{dk}\right\rfloor}j \]

\(\mu(k)\) 显然可以通过预处理线性求出,所以只用先对 \(d\) 整除分块,然后套一个对 \(k\) 的整除分块即可。

posted @ 2025-03-31 20:32  ni_ju_ge  阅读(136)  评论(1)    收藏  举报