数论+组合

LaTeX

注:引理见后面第四部分

1.欧拉函数,欧拉筛及应用

1.欧拉筛:

for(int i = 2;i <= N;i++)
{
	if(!vis[i]) pri[++cnt] = i;
	for(int j = 1;i * pri[j] <= N;j++)
	{
		int u = i * pri[j];
		vis[u] = 1;
		if(i % pri[j] == 0) break;
	}
}

2.欧拉函数:φ(n)

计算:φ(n)=n×i=1n(11pi)

用欧拉筛实现:
m=pri[j]×i

1>若imodpri[j]==0

φ(m)=m×i=1k(11pi)=pri[j]×i×i=1k(11pi)=pri[j]×φ[i]

2>若imodpri[j]!=0,说明二者互质

φ(m)=φ(pri[j])×φ(i)=(pri[j]1)×φ(i)

2.定理

欧拉定理:

gcd(a,m)=1

aφ(m)1(modm)

裴蜀定理

a,bZ

则存在x,y,使得

ax+by=gcd(a,b)

推广1:存在x,y,使得

ax+by=gcd(a,b)×n

推广2:存在X1Xn,使得

i=1nAiXi=gcd(A1,A2,,An)

扩展欧几里得

对方程ax+by=gcd(a,b)(设gcd(a,b)=d

可得到

{ax0+by0=gcd(a,b)bx1+(a%b)y1=gcd(b,a%b)

gcd(a,b)=gcd(b,a%b)

ax0+by0=bx1+(a%b)y1

又有a%b=a(int)a/b×b

(int)a/b=k

ax0+by0=bx1+(akb)y1

整理得

ax0+by0=ay1+b(x1ky1)

{x0=y1y0=x1ky1

这是相邻两组解的关系,那么这样推下去,则a%b会变成0(求gcd时的终止条件)

则有

d×xn+0×yn=d

则存在特解

{xn=1yn=0

递归反推每一组解即可

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

通解:

{x=x0+bgcd(a,b)×ky=y0agcd(a,b)×k

扩展欧拉定理

ab{abmodφ(p)gcd(a,p)=1abgcd(a,p)1,b<φ(p)abmodφ(p)+φ(p)gcd(a,p)1,bφ(p)(modp)

证明:

对于第一个式子,由欧拉定理

abak×φ(p)+r(aφ(p))k+ar1k+arabmodφ(p)

第二个式子用于b较小的时候

下证第三个式子

a=i=1spiri

(分解质因数)

代入

(i=1spiri)b(i=1spiri)bmodφ(p)+φ(p)(modp)

i=1s(piri)bi=1s(piri)bmodφ(p)+φ(p)(modp)

$\prod\limits_{i = 1}{s}p_ib \equiv \prod\limits_{i = 1}^{s}p_i ^{b \operatorname{mod} \varphi(p)+\varphi(p)} \pmod p $

即证明对

1is,pibpibmodφ(p)+φ(p)(modp)

(在此之后,模数更换为m

1ispibpibmodφ(m)+φ(m)(modm),并将pi写成p,p是质数)

如果gcd(p,m)=1,则

pbpb×1pbmodφ(m)×pφ(m)pbmodφ(m)+φ(m)

如果不等于1,则m=k×p(k2)

m=s×pr,gcd(s,pr)=1=gcd(s,p)

pφ(s)1(mods)

又有φ(m)=φ(pr)×φ(s)

那么pφ(m)1φ(pr)1(mods)--------------①

又因为

pb=(pφ(m))bφ(m)×pbmodφ(m)

并由①:(pφ(m))bφ(m)1bφ(m)1(mods)

pbpbmodφ(m)(mods)

pb+rpbmodφ(m)+r(mods×pr)

(由引理)

pb+rpbmodφ(m)+r(modm)

pb+φ(m)pbmodφ(m)+φ(m)(modm)(同乘pφ(m)r

由①:

pφ(m)+rpr(mods×pr)

pφ(m)+rpr(modm)

所以

pbpbr×prpbr×pφ(m)+rpb+φ(m)pbmodφ(m)+φ(m)(modm)

证毕

Lucas定理

CnmCn/pm/p×Cn%pm%p(modp)

p为素数)

证明:

首先:

Cpxp!x!(px)!px×Cp1x1p×x1×Cp1x10(modp)

其中0<x<p,gcd(x,p)=1

所以x的逆元存在

再由上

(1+x)ni=0nCnixiCn0×1+Cnn×xn1+xn(modp)

接下来

(1+x)ni=0nCnixiα(1+x)ap+b((1+x)p)a×(1+x)b(1+xp)a×(1+x)bi=0aCaixip×j=0bCbjxjβ(modp)

xm=xcp+d=xcp×xd

α,β式和系数相等:

Cnm=Cac×Cbd

再结合n=ap+b,m=cp+d

CnmCn/pm/p×Cn%pm%p(modp)

中国剩余定理(CRT)

{xr1(modm1)xr2(modm2)xrn(modmn)

1i<jn,gcd(mi,mj)=1

那么

xmin+=i=1nricici1modM

其中
M=i=1nmi

ci=Mmi

ci1ci在模mi意义下的逆元

证明:

首先:对xri(modmi),先不求余

xj=1&j!=inrjcjcj1+ricici1j=1&j!=inrjmi×Mmi(Z)mjcj1+ricici1Mmi%mi!=00+ricici1ri(modmi)

再:

xmin+x%Mx+(k)×Mxmi|M(modmi)

扩展中国剩余定理(exCRT)

mi不一定两两互质

最直观的:不求余中第一个注释处将不成立(Mmi%mi!=0互质时必成立,但不互质时不一定),无法进行后续计算

EX:

对于

xr1(modm1)

xr2(modm2)

转化为

x=m1p+r1=m2q+r2

m1pm2q=r2r1

由裴蜀定理

gcd(m1,m2)|(r2r1)时有解

特解与通解:(exgcd)

p=p0+m2gcd×k,q=q0m1gcd×k

所以

x=m1p+r1=m1p0+m1m2gcd×k+r1

那么

xm1p0+r1(modm1m2)

也就是说,两个方程可以合并成一个方程:

xr(modm),r=m1p0+r1,m=lcm(m1,m2)

合并n1次即可

ExLucas(与Lucas无关)

Cnmmodp

其中p不一定是质数

p=i=1kpiαi

那么只需求

{Cnmmodpiαi

再用CRT合并即可(得到的是和Cnm同余的最小正整数)

考虑求

Cnmmodpk,pprime

n!m!(nm)!modpk

考虑到阶乘可能包含p因子,所以先除干净

n!pxm!py×(nm)!pz×pxyzmodpk

其中x,y,z均为对应阶乘中含有的p因子数量

则再求

n!pxmodpk

(分母那俩求逆元就行了)

考虑按是否是p的倍数划分阶乘

n!=i=1ni=i=1np(i×p)×j=1,j%p!=0nj=pnp×(np)!×j=1,j%p!=0nj

对于后面一坨,考虑到mod有循环节,后面循环的部分可以直接“掏”掉若干次方的模数成为第一部分的循环节

比如:

(1×2×4×5)×(10×11×13×14)(1×2×4×5)2(mod9)

其中后半部分循环节可以掏掉一个9变成第一部分

那么

j=1,j%p!=0nj=(i=1,i%p!=0pki)npk×(i=pk×npk,i%p!=0ni)

前半部分是掏完模数的所有循环节,可以并成乘方,后半部分是剩的

所以

n!=pnp×(np)!×(i=1,i%p!=0pki)npk(i=pk×npk,i%p!=0ni)

第一项要除掉,但第二项中可能还有p因子

所以定义

f(n)=n!px

f(n)=f(np)(i=1,i%p!=0pki)npk(i=pk×npk,i%p!=0ni)

回到原式,即求

f(n)f(m)f(nm)pxyzmodpk

接下来求x,y,z

g(n)=x(就是n的阶乘中有多少个p因子)

结合n!的展开式,可得

g(n)=np+g(np)

so~

Cnmmodpk=f(n)f(m)f(nm)pg(n)g(m)g(nm)modpk

f(n)=n!px

g(n)=x

合并即可

容斥原理

|i=1nAi|=i=1n|Ai|i<j|AiAj|+i<j<k|AiAjAk|+(1)n1|A1A2An|

奇数个集合交集个数的系数为正,偶数个集合交集个数的系数为负

这实在没法证就那样不断修正后就这样了

3.乘法逆元

定义:若a×x1(modb),则xa在模b意义下的乘法逆元,记为a1

使用:(a/b)%p=a×b1%p

方法 条件 时间复杂度 备注
费马小定理 模数为素数 O(logn)
欧拉定理 gcd(a,p)=1 O(n)
扩展欧几里得 gcd(a,p)=1 O(logn) 可以判断是否互质
线性递推 模数为素数 O(n)

exgcd:求ax+by=1x的最小正整数解(如果有的话)

Fermat:可知ap11(modp)

a×ap2%p1(modp)

ap2%p为逆元,快速幂求解

Euler:类似于Fermat,aφ(p)1为逆元

线性:对于质数p,求1,2,,p1的逆元

p=k×i+r(1<i<p,r<i)

k×i+r0(modp)

k×i×i1×r1+r×i1×r10(modp)

k×r1+i10(modp)

i1k×r1(modp)

i1pi×r1(modp)

i1pi×(pmodi)1(modp)

inv[i]=p/i×inv[p%i]

inv[1]=1

保证非负:inv[i]=(pp/i)×inv[p%i]%p

4.结论/引理

任意互质的a,n,满足ax1(modn)的最小x一定是φ(n)的约数

证明:若不是,则有

x×k+r=φ(n)(r<x,kZ)

由已知:axaφ(n)1(modn)

则有ax×k1k1(modn)

进一步的:ax×k+rar(modn) ------- a

又因为x已经最小,那么$a^r n1r < x$)

又由式子a可得:1aφ(n)ar(modn)

矛盾!

gcd(a,b)=gcd(a+k×b,b)

证明:

gcd(a,b)=d

a=p×d,b=q×d(gcd(p,q)=1)

gcd(a+k×b,b)=gcd(pd+kqd,dq)=gcd(d(p+k×q),dq)=d×gcd(p+k×q,q)

m|p+k×q,m|q,则m|p

gcd(p+k×q,q)=m=1

gcd(a+k×b,b)=d

ab(modm),则a×kb×k(modm×k)

证明:
a=s×m+r

b=t×m+r

a×kb×k=(st)×m×k

a×kb×k(modm×k)

组合

常见策略

  • 特殊位置(元素)优先

  • 相邻元素整体法(注意整体内部的排序与组合)

  • 不相邻问题插空法

  • 定序问题倍缩法(总数 / 定序部分的全排列数)

  • 排列问题求幂法

  • 环排问题线排策略

    一般的,n个元素做圆形排列,排法为(n1)!

    n个不同元素中选择m个元素排列,排法为Anm/m

  • 多排问题直排策略

  • 混合问题先选(C)后排(A

  • 平均分组问题除法策略

  • 重排列(多部分定序)

  • 隔板法:将n个物体分成m堆,每堆至少一个

    等价为:n1个间隔中插入m1个隔板(分成m部分)

    允许堆空:Cn+m1m1

错位排序

D(n)=(n1)×(D(n1)+D(n2))

Catalan数

定义

H(0)=1,H(1)=1

H(n)=i=0n1H(i)×H(n1i)

H(n)=C2nnC2nn1=(2n)!n!n!(2n)!(n1)!(n+1)!=(2n)!n!(n1)!(1n1n+1)=(2n)!n!(n1)!×1n(n+1)=(2n)!n!n!×(n+1)=1n+1C2nn

H(n)=4n2n+1H(n1)

应用:

(1).(典例/特征)从(0,0)走到(n,n),且路径不超过对角线的路径总数为H(n)

证明:

路径总数:C2nn(共2n步,其中n步向上/右)

对角线:y=x

非法路径超过对角线,说明与y=x+1有交点

将该交点以后的路径关于y=x+1对称,终点变为(n+1,n1)

也就是说,所有非法路径其实就是从(0,0)(n+1,n1)的所有路径

那么合法路径就是C2nnC2nn1

(2).n个元素进栈序列为1,2,,n,则出栈序列总数 = H(n)

将进栈抽象为走格子中向右走,出栈抽象为走格子中向上走,又因为一个元素进一次出一次,共2n次,那么就相当于:

(0,0)走到(n,n),任意时刻向上走的步数不能超过向右走的步数(出>入),也就是不超过对角线

显然的卡特兰数

(3).n对括号,能够匹配的序列总数

一共2n个符号,左括号n个,右括号n个,记答案为f(2n)(显然,括号里为字符数)

很显然,匹配的序列满足:任意一对括号中必有偶数个字符

我们选定一组括号作为分界,命名为括号W,左括号在第0位,那么右括号在
0+2×k(中间括号个数)+1=2k+1

每一个括号W的分布,对答案的贡献是

括号W内部的括号匹配排列数 × 括号W外的括号匹配序列数

比如:括号W的位置为0,3,那么内部有2个字符,外部有2n22=2n4个字符,那么贡献就是

f(2)×f(2n4)

那么

ans=i=1n1f(2i)×f(2n22i)

由于自变量是字符个数 =2×括号个数n,实际上这个答案改成以个数为自变量就是

ans=i=1n1f(2i2)×f(2n22i2)=i=0n1f(i)×f(n1i)

形式决定本质:鉴定答案为H(n)

类似的想法还有

n个节点的不同二叉树排列形式

非根结点总数n1,分成两部分(左右子树)排,无了,H(n)

一个凸多边形(顶点数为n)划分成三角形区域的方法数

先选定一个三角形把多边形分成两部分,该三角形占用3个顶点,那么左右的多边形节点总数为n+1个(三角形的一个顶点会被算两次)

那么

ans=i=2n1f(i)×f(n+1i)

总和为n1时答案为H(n),那么此时答案就是H(n2)

总结:Catalan数的运用场景

  • 任取一个集合作为选定集合K,能将全集U(所有元素,大小为n)分成两个子集S,T,且两子集的大小的和一定,设为sum(具体数值依题而定)

  • 那么每一种分割情况对答案的贡献就是

f(|S|)×f(sum|S|)=f(|S|)×f(|T|)

  • 对应答案就是H(n(sum(n1)))

  • 注意:S,T中的元素必须全部等价(括号和括号等价之类,不会受到元素性质影响),否则贡献成为Csum|S|×f(|S|)×f(|T|)

    典例:P2606 排列计数,由于排列受大小影响,所以前面的组合数无法消去

对应一下:

  • 括号类型中,选定集合为一组(个)括号,剩余括号根据是否在选定括号内分成两个集合,并且由于每次的选定集合大小一定,所以这两个集合大小之和一定

  • 二叉树的排列中,选定集合为根节点,剩余节点根据左右子树分为两个集合,且由于根节点只有一个,所以这两个集合大小之和一定

  • 典例中的走格子也是,不计非法时的和为2n,但是有一半的路径会被砍掉,和变成n,又因为|S|=|T|属于边界条件算一次,所以和变为n1

Prufur序列

Prufur序列是用一个序列来表示无根树的东西,对于一颗n个节点的无根树,可以构造出唯一确定的长度为n2Prufur序列

构造:

Tree>Prufur

  • 找到编号最小的叶子结点,将它的父节点计入序列

  • 删去该叶子结点

  • 重复上述过程直到剩下两个节点

如图

Prufur>Tree

  • 初始化一个点集为所有点

  • 取出Prufur序列最前面的元素x

  • 取出点集中不在Prufur序列中的最小编号y

  • 连边,删去x,y

  • 重复上述过程,在点集中最后剩下的两个点之中连一条边

如图

(还是以上图中的树为例)

性质:

  • 一 一对应

  • 度数为di的节点会在序列中出现di1

其中,一一对应(双射)是非常有用的一条性质,这个性质可以让我们对数列(而不是树)进行排列组合以获得方案数而且不用担心重复(一个序列只对应一棵树,序列不同,树一定不同)

应用:

  • 无向完全图的生成树数量:nn2

很好理解:n2个空,每个空上可填1n

  • i个节点的度数为di :

(n2)!i=1n(di1)!

这就是一个重排列问题

如果有k个节点能进入序列,那么每个节点的出现次数一定是di1,由重排列得到An2n2i=1kAdi1di1

又因为(11)!=0所以叶子节点的度不影响结果,索性从1n计算(也省去了求k的时间)

实际中,却总有一些逆天情况

  • 若干节点的度数没有限制

设有m个节点没有度数限制,有k个节点有度数限制

sum=n2i=1k(di1),表示剩下的节点还能出现几次

把未知度数的节点视为一个整体,运用重排列得到方案数:An2n2i=1kAdi1di1×sum!

再考虑这个整体内部的方案数,由于无度数限制,直接随便排

ans=An2n2i=1kAdi1di1×sum!×msum,sum=n2i=1k(di1)

BSGS

已知a,b,p,gcd(a,p)=1,求

axb(modp)

的最小非负整数解

由扩展欧拉定理:axaxmodφ(p)(modp)

因为φ(p)p1<p,所以[0,p1]中一定有解

x=imj,m=p,i[1,m],j[0,m1]

aimjb(modp)

(am)ibaj(modp)

先枚举j,求出baj,用unordered_map存储(baj,j),如果关键字重复,用j大的替代旧的

再枚举i,求出(am)i,如果表中有相同的结果,找到第一个(j最大)就结束,ans=imj

斯特林数

第一类斯特林数: [nm]

组合意义:让n个人坐m个圆桌(大小足够且不能有空桌)的方案数

递推:

[nm]=[n1m1]+(n1)[n1m]

解释:对于一个人,可以让他单独占一张桌子,也可以先让剩下n1个人坐m张桌子,然后把这个人插入这些人的左边,共n1种方案

第二类斯特林数:{nm}

组合意义:将n个球放入m个盒子中(均相同而且要求非空)的方案数

与前者区别:圆桌即圆排列,但盒子内没有次序

递推:

{nm}={n1m1}+m{n1m}

解释: 对于一个小球,可以让他单独占一个盒子,或者其他小球先放,他随便放入一个盒子

posted @   why?123  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示