数论基础

一、基础概念(略)#

质数

约数

同余

二、质数#

A.质数筛法#

暴力筛(略)#

埃筛(O(nloglogn)#

Copy
inline void prim(int limit) {//埃筛 vis[1] = 1; for (int i = 2;i <= limit; ++i) { if (!vis[i]) { prims[++p_cnt] = i; for (int j = i * i;j <= limit; j += i) vis[j] = 1; } } }

欧筛(O(n)#

Copy
inline void ola_prim(int limit) {//欧筛 vis[1] = 1; for (int i = 2;i <= limit; ++i) { if (!vis[i]) { vis[i] = i; prims[++p_cnt] = i; } for (int j = 1;j <= p_cnt; ++j) { if (prims[j] > vis[i] || prims[j] > limit / i) break; vis[i * prims[j]] = prims[j]; } } }

三、约数与同余#

A.欧几里得算法#

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

数学归纳法可推广到一般。

B.裴蜀定理#

描述
如果任意整数ab不都为0,则gcd(a,b)ab的线性组合集{ax+by:x,yZ}中的最小正元素。

证明
s是线性组合集{ax+by:x,yZ}中的最小正元素,q=a/s
所以必存在一组x,y使得ax+by=s

所以a%s=aqs=aq(ax+by)=a(1qx)+b(qy)
因此a%s也是ab的一个线性组合。

由于s是这个线性组合中最小正数,所以a%s=0。即s|a,同理,s|b,所以gcd(a,b)s

因为gcd(a,b)|ss>0,所以gcd(a,b)s
gcd(a,b)=s
得证。

C.扩展欧几里得算法#

四、组合计数#

A.加法和乘法原理#

加法原理:做一件事情,完成它有n类方式,第一类方式有m1种方法,第二类方式有m2种方法,…,第n类方式有mn种方法,那么完成这件事情共有m1+m2++mn种方法。

乘法原理:做一件事,完成它需要分成n个步骤,做第一步有m1种不同的方法,做第二步有m2种不同的方法,……,做第n步有mn种不同的方法。那么完成这件事共有 m1×m2×m3××mn种不同的方法。

B.排列组合公式#

全排列:Anm=n!(nm)!=An1m+An1m1m

组合数:Cnm=n!m!(nm)!=Cn1m1+Cn1m

性质:

  • i=0nCni=2n(根据意义去思考)
  • k=0n(1)kCnk=0
  • Cnm=Cnnm
  • Cn+mr=i=0rCniCmri

C.二项式定理#

(x+y)n=Cn0xny0+Cn1xn1y1+...+Cnn1x1yn1+Cnnx0yn

可用数学归纳法证明。

D.容斥原理#

交集相加减得并集。

E.斯特林数#

  • 第一类斯特林数:n个不同元素构成m个圆排列的数目。
    s1(n,m)=s1(n1,m1)+s1(n1,m)(n1)
  • 第二类斯特林数:n个不同的元素拆分成m个集合的方案数。
    s2(n,m)=s2(n1,m1)+s2(n1,m)m
  • 贝尔数:集合划分的方案数。
    Bn=i=1ns2(n,i)=k=0nCnkBk

F.康托展开#

ans=1+i=1nA[i](ni)!

A[i]:当前位置往后比当前位置数小的个数,可用树状数组求。

补充

进制转换(略)#

球盒问题#

a个球,b个盒,求满足放置条件的方案数。

编号 球相同 盒相同 盒可为空 计算
1 × × s2(a,b)
2 × i=1bs2(a,i)
3 × × × b!s2(a,b)
4 × × ba
5 × dp[n][m]
6 dp[n+m][m]
7 × × Ca1b1
8 × Ca+b1b1
说明:

表中s2指的是第二斯特林数。

递推式:s2(n,m)=s2(n1,m1)+s2(n1,m)m

同时,贝尔数Belln=i=1bs2(a,i)

情况56的递推式:dp[n][m]=dp[nm][m]+dp[n1][m1]

简要分析如下:

  1. n个不同的元素拆分成m个集合的方案数,等同于第二斯特林数。
  2. 允许出现空集,所以求和。
  3. 容斥原理做,或者可以理解为因为盒子不同,所以直接乘上盒子的排列。
  4. 最好理解:每个球有b种放法。
  5. 这个问题等效成把一个数n拆成m个数,且先拆出的数不小于后拆出的数(避免重复情况)。如果这么拆:x1+x2+x3+...+xm=n(xi>=1)。当x1=1时,后面的拆法表示成dp[n1,m1]。当x1>=2时,式子可以变成(x11)+(x21)+...+(xm1)=nm。所以后面的拆法表示成dp[nm,m]。所以得到递推式。
  6. 在情况5下,每盒先放一个。
  7. 插板问题。
  8. 同插板问题。
posted @   SilentEAG  阅读(353)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示
CONTENTS