竞赛中会用到的初等数论

0. 线性筛

[1,n][1,n][1,n]的范围内找质数,复杂度线性O(n)O(n)O(n)。

基于一个简单的想法:每个合数只在他的最小质因数删去。

我们要删去的数xxx,
x=p0×fntlx=p_{0}\times f_{ntl}x=p0​×fntl​
其中p0p_{0}p0​为xxx的最小质因数,fntlf_{ntl}fntl​为xxx的次大因数。

void GetPrime(int n)
{memset(isPrime, 1, sizeof(isPrime));isPrime[1] = 0;for(int i = 2; i <= n; i++) //穷举次大因数{if(isPrime[i])Prime[++cnt] = i; for(int j = 1; j <= cnt && i*Prime[j] <= n; j++) //穷举最小质因数{isPrime[i*Prime[j]] = 0;if(i % Prime[j] == 0) break; //当i里有Prime[j]这个因子的时候,Prime[j+1]一定不是i*Prime[j+1]的最小质因数,所以终止,下个不用做了,因为不满足最初的"简单的想法"}}
}

后话:如果把isPrime[i]isPrime[i]isPrime[i]看成一个函数的话,表示i是不是一个质数,那么这里其实是在用递推求值。边界条件其实是iii为质数的时候,函数的值为1。当然这个函数不满足积性(下一节会讲到)。

1. 欧拉函数

欧拉函数 ϕ(x)\phi(x)ϕ(x),表示的是范围[1,x][1,x][1,x]中与x互质的整数的个数。举几个例子,ϕ(1)=0,ϕ(2)=1,ϕ(3)=2,⋯\phi(1)=0,\ \phi(2)=1,\ \phi(3)=2,\ \cdotsϕ(1)=0, ϕ(2)=1, ϕ(3)=2, ⋯

容易观察到,对于任意一个质数ppp, ϕ(p)=p−1\phi(p)=p-1ϕ(p)=p−1

接下来考虑ϕ(pk)\phi(p^k)ϕ(pk),由于pkp^kpk只有唯一的质因数p,所以一个与其不互质的数一定包含因子p。所以[1,pk][1,p^k][1,pk]中的p的倍数都与pkp^kpk不互质,其他都与其互质。这个范围内p的倍数总共有pk−1p^{k-1}pk−1个。因此,
ϕ(pk)=pk−pk−1=(p−1)pk−1\phi(p^k)=p^k-p^{k-1}=(p-1)p^{k-1}ϕ(pk)=pk−pk−1=(p−1)pk−1

下面证明一下ϕ(x)\phi(x)ϕ(x)具有一下性质,
对于(x,y)=1(x,y)=1(x,y)=1,有ϕ(x⋅y)=ϕ(x)⋅ϕ(y)\phi(x\cdot y)=\phi(x)\cdot \phi(y)ϕ(x⋅y)=ϕ(x)⋅ϕ(y)

这里用Dirichlet卷积,对交换代数有兴趣的话,同样也可以验证环同态,这个放在Appendix里。

考虑集合Ad={i∣(x,i)=d},d∣x即d为x的一个因数。A_d=\{i|(x,i)=d\},\ d|x\ 即d为x的一个因数。Ad​={i∣(x,i)=d}, d∣x 即d为x的一个因数。
∣Ad∣=ϕ(x/d)|A_d|=\phi(x/d)∣Ad​∣=ϕ(x/d)
显然有上式(觉得不显然的可以考虑i=k⋅di=k\cdot di=k⋅d的系数k,满足条件时,有几种取值),

x=∑d∣xϕ(x/d)x=\sum_{d|x}\phi(x/d)x=d∣x∑​ϕ(x/d)

写成Dirichlet卷积形式

1∗ϕ(x)=∑d∣xϕ(x/d)=x1*\phi(x)=\sum_{d|x}\phi(x/d)=x1∗ϕ(x)=d∣x∑​ϕ(x/d)=x

1的卷积逆是Mobius的μ\muμ, 所以ϕ(x)=μ∗x\phi(x)=\mu*xϕ(x)=μ∗x,两个积性函数的卷积还是积性函数,所以欧拉函数也是积性函数。

有了积性和唯一分解定理可以写出欧拉函数的通项

x的唯一质因数分解:
x=p1k1p2k2⋯pnknx=p_1^{k_1} p_2^{k_2}\cdots p_n^{k_n}x=p1k1​​p2k2​​⋯pnkn​​
thenϕ(x)=(p1−1)k1−1(p2−1)k2−1⋯(pn−1)kn−1then\ \phi(x)=(p_1-1)^{k_1-1}(p_2-1)^{k_2-1}\cdots (p_n-1)^{k_n-1}then ϕ(x)=(p1​−1)k1​−1(p2​−1)k2​−1⋯(pn​−1)kn​−1

然后可以愉快的用这三个式子来做递推

ϕ(x)=x−1x为质数ϕ(i×prime(j))=ϕ(i)×ϕ(prime[j])(i,prime[j])=1ϕ(i×prime(j))=ϕ(i)×prime[j](i,prime[j])=prime[j]\begin{aligned} \phi(x) &= x-1 & x为质数 \\ \phi(i\times prime(j))=&\phi(i)\times \phi(prime[j]) &(i,prime[j])=1\\ \phi(i\times prime(j))=&\phi(i)\times prime[j] &(i,prime[j])=prime[j]\\ \end{aligned} ϕ(x)ϕ(i×prime(j))=ϕ(i×prime(j))=​=x−1ϕ(i)×ϕ(prime[j])ϕ(i)×prime[j]​x为质数(i,prime[j])=1(i,prime[j])=prime[j]​

void GetPrime(int n)
{memset(isPrime, 1, sizeof(isPrime));isPrime[1] = 0;for(int i = 2; i <= n; i++) //穷举次大因数{if(isPrime[i]){Prime[++cnt] = i; phi[i]=i-1;//i为质数}    for(int j = 1; j <= cnt && i*Prime[j] <= n; j++) //穷举最小质因数{isPrime[i*Prime[j]] = 0;phi[i*Prime[j]]=phi[i]*phi[Prime[j]];//i Prime[j]互质if(i % Prime[j] == 0) {phi[i*Prime[j]]=phi[i]*Prime[j];//i Prime[j]不互质break; }}}
}

求单个数的欧拉函数可以用通项和因式分解求。
同样利用∣Ad∣=ϕ(x/d)|A_d|=\phi(x/d)∣Ad​∣=ϕ(x/d)
可以使用分块法解决一些求和问题,比如求∑i=1n(i,n)=∑d∣nd×ϕ(n/d)\sum_{i=1}^n (i,n)=\sum_{d|n} d\times \phi(n/d)∑i=1n​(i,n)=∑d∣n​d×ϕ(n/d)
习题:P2158

2. 费马小定理和欧拉定理

i.欧拉定理

对于任意正整数a和x,aϕ(x)≡1modxa^{\phi(x)}\equiv 1 \mod xaϕ(x)≡1modx

ii.费马小定理

对于任意正整数a和质数p,ap−1≡1modpa^{{p-1}}\equiv 1 \mod pap−1≡1modp
证明放在附录里,用的是群论的Lagrange Theorem
费马小定理可以用来判断一个数质数,用快速幂可以达到O(lg⁡n)O(\lg n)O(lgn)的复杂度,也可以用来求一个数关于p的数论倒数
a(p−2)a≡1modpa^{(p-2)} a \equiv 1\mod p a(p−2)a≡1modp
a(p−2)≡a−1modpa^{(p-2)} \equiv a^{-1} \mod p a(p−2)≡a−1modp

3. 裴蜀定理

两个整数a,ba , ba,b, 最大公约数为(a,b)=d(a,b)=d(a,b)=d,∃\exist∃整数x,yx,\ yx, y, 满足ax+by=d;ax+by=d;ax+by=d;
∀\forall∀整数x,yx,\ yx, y,
ax+by≡0moddax+by\equiv 0 \mod dax+by≡0modd
证明很简单,这里就不展开讲了 有兴趣的同学自己去证明一下。
下面一节会去解决这个求这个a, b的问题。

4. 辗转相除和扩展欧几里得以及求逆元

辗转相除法可以看成一个递归, 递归式是(a,b)=(b,a%b)(a,b)=(b,a\%b)(a,b)=(b,a%b),边界条件为(a,0)=a(a,0)=a(a,0)=a.
正确性很容易证明,复杂度在1844年被一个法国人计算出来,结果是不会大于5lg⁡min(a,b)5\lg min(a,b)5lgmin(a,b),标志着算法复杂度理论的开端。

这里提供一种构造Fibonacci的夹逼证明,
Proof
Statement 1: 如果一组a, b在n步辗转相除计算出结果,那么有a>=fn+2b>=fn+1a>=f_{n+2}\\b>=f_{n+1}a>=fn+2​b>=fn+1​
fnf_nfn​为Fibonacci数列的第n项。
这里可以用数学归纳法证明:
当第n步满足考虑(n+1)时,
an+1=⌊an+1bn+1⌋an+bn>=⌊an+1bn+1⌋fn+2+fn+1>=fn+2+fn+1=fn+3a_{n+1}=\lfloor \frac{a_{n+1}}{b_{n+1}} \rfloor a_n+b_n>=\lfloor \frac{a_{n+1}}{b_{n+1}} \rfloor f_{n+2}+f_{n+1}>=f_{n+2}+f_{n+1}=f_{n+3}an+1​=⌊bn+1​an+1​​⌋an​+bn​>=⌊bn+1​an+1​​⌋fn+2​+fn+1​>=fn+2​+fn+1​=fn+3​
下面只需要考虑Fibonacci的第n项是多少就可以了,如果学过矩阵乘法或者求矩阵特征向量特征根的话那就很容易了,如果没有的话可以去学一学,这里直接给出通项。
fn=(1+52)n−(1−52)n5f_n=\frac{(\frac{1+\sqrt{5}}{2})^n-(\frac{1-\sqrt{5}}{2})^n}{\sqrt{5}}fn​=5​(21+5​​)n−(21−5​​)n​
显然 fnf_nfn​和nnn是指数关系,即fn=an,a>1f_n=a^n,\ a>1fn​=an, a>1
所以由bn≈fn+1b_n\approx f_{n+1}bn​≈fn+1​可以得到,n≈log⁡abn \approx \log_a{b}n≈loga​b

以上为辗转相除的复习

下面考虑这样一个问题,即解决裴蜀定理,已知a,b
ax+by=gcd(a,b)ax+by=gcd(a,b)ax+by=gcd(a,b)
求一组整数解x, y。

考虑辗转相除法:
边界条件:ax(n)+0⋅y(n)=gcd(a,0)=aax^{(n)}+0\cdot y^{(n)}=gcd(a,0)=aax(n)+0⋅y(n)=gcd(a,0)=a
显然有一组解:x(n)=1,y(n)=0x^{(n)}=1,\ y^{(n)}=0x(n)=1, y(n)=0

第一层:ax(k)+by(k)=gcd(a,b)ax^{(k)}+by^{(k)}=gcd(a,b)ax(k)+by(k)=gcd(a,b)
第二层:bx(k+1)+ry(k+1)=gcd(b,r),a≡rmodbbx^{(k+1)}+ry^{(k+1)}=gcd(b,r),\ a \equiv r \mod bbx(k+1)+ry(k+1)=gcd(b,r), a≡rmodb
有gcd(a,b)=gcd(b,r)gcd(a,b)=gcd(b,r)gcd(a,b)=gcd(b,r), 和上面两式结合有:ax(k)+by(k)=bx(k+1)+ry(k+1)ax^{(k)}+by^{(k)}=bx^{(k+1)}+ry^{(k+1)}ax(k)+by(k)=bx(k+1)+ry(k+1)
r=a−⌊ab⌋br=a-\lfloor \frac{a}{b}\rfloor br=a−⌊ba​⌋b
ax(k)+by(k)=bx(k+1)+(a−⌊ab⌋b)⋅y(k+1)ax^{(k)}+by^{(k)}=bx^{(k+1)}+(a-\lfloor \frac{a}{b}\rfloor b)\cdot y^{(k+1)}ax(k)+by(k)=bx(k+1)+(a−⌊ba​⌋b)⋅y(k+1)
上式左右两边相等可以得到:
x(k)=y(k+1)y(k)=x(k+1)−⌊ab⌋y(k+1)\begin{aligned} x^{(k)}&=y^{(k+1)}\\ y^{(k)}&=x^{(k+1)}-\lfloor \frac{a}{b}\rfloor y^{(k+1)} \end{aligned} x(k)y(k)​=y(k+1)=x(k+1)−⌊ba​⌋y(k+1)​
于是就得到了一个递推式,结合边界条件就可以得到解。

void Ex_gcd(int a, int b, int &x, int &y)
{if(b == 0){x = 1;y = 0;return;}int x1, y1;Ex_gcd(b, a%b, x1, y1);x = y1;y = x1-(a/b)*y1;
}

然后求到x(1),y(1)x^{(1)},\ y^{(1)}x(1), y(1),之后可以通过加上若干个ap+bq=0,a>0a p +b q=0,\ a>0ap+bq=0, a>0,那么x的最小正整数解就是x≡x(a)modpx\equiv x^{(a)}\mod px≡x(a)modp。

5. 中国剩余定理

韩信点兵:3个人一排剩2个,5个人一排剩3个,7个人一排剩2个,问有几个人?
答案233个或23个⋯\cdots⋯!
问题的形式化:
x≡a1modm1x≡a2modm2…x≡akmodmk\begin{aligned} x &\equiv a_1 \mod m_1\\ x &\equiv a_2 \mod m_2\\ &\dots\\ x &\equiv a_k \mod m_k \end{aligned} xxx​≡a1​modm1​≡a2​modm2​…≡ak​modmk​​
任意两个mi,mjm_i,\ m_jmi​, mj​, 需要满足(mi,mj)=1(m_i,m_j)=1(mi​,mj​)=1。

构造一个M=m1m2…mkM=m_1m_2\dots m_kM=m1​m2​…mk​
再定义一个
M1=Mm1M2=Mm2⋯Mk=Mmk\begin{aligned} M_1&=\frac{M}{m_1}\\ M_2&=\frac{M}{m_2}\\ &\cdots\\ M_k&=\frac{M}{m_k}\\ \end{aligned} M1​M2​Mk​​=m1​M​=m2​M​⋯=mk​M​​
对于MiM_iMi​, 可以求一个tit_iti​,满足Miti≡1modmiM_i t_i \equiv 1\mod m_iMi​ti​≡1modmi​。
这时候就构造出来了!x=∑i=1kaitiMix=\sum_{i=1}^k a_it_iM_ix=i=1∑k​ai​ti​Mi​
xxx显然是上述同余方程组的解。

其中唯一有问题的就是其中求tit_iti​,就是求一个整数a关于p的倒数,现有(a,p)=1(a,p)=1(a,p)=1,
(a⋅x)%p=1(a\cdot x)\%p=1(a⋅x)%p=1可以转化成
a⋅x+p⋅y=1=(a,p)a\cdot x+p\cdot y=1=(a,p)a⋅x+p⋅y=1=(a,p)
于是就可以用扩展欧几里得算法来求xxx和yyy了,当然我们只需要求xxx。

6. 威尔逊定理

p是质数⇔(p−1)!≡p−1modpp是质数 \Leftrightarrow (p-1)!\equiv p-1 \mod pp是质数⇔(p−1)!≡p−1modp
必要性显然
充分性给一个用费马小定理的证明,p≥3p\geq 3p≥3且p是质数:
f(x)=(x−1)⋅(x−2)…(x−(p−1))=xp−1+(1+2+⋯+p−1)xp−2+⋯+(p−1)!\begin{aligned} f(x)&=(x-1)\cdot (x-2) \dots (x-(p-1)) \\ &=x^{p-1}+(1+2+\dots +p-1)x^{p-2}+\dots+(p-1)! \end{aligned} f(x)​=(x−1)⋅(x−2)…(x−(p−1))=xp−1+(1+2+⋯+p−1)xp−2+⋯+(p−1)!​
注意这里满足f(x)=0的根为1∼(p−1)1\sim(p-1)1∼(p−1)

定义g(x)=xp−1−1g(x)=x^{p-1}-1g(x)=xp−1−1
根据费马小定理,满足g(x)≡0modpg(x) \equiv 0 \mod pg(x)≡0modp的解也是1∼(p−1)1\sim(p-1)1∼(p−1)
所以对于任意的xxx,满足h(x)=f(x)−g(x)≡0modph(x)=f(x)-g(x)\equiv 0 \mod ph(x)=f(x)−g(x)≡0modp

但是考虑到h(x)h(x)h(x)的最高此项是x(p−2)x^(p-2)x(p−2)这一项,所以方程h(x)≡0modph(x)\equiv 0\mod ph(x)≡0modp最多有(p−2)(p-2)(p−2)个解,因此h(x)h(x)h(x)只能恒等于0。

所以他的常数项 (p−1)!+1(p-1)!+1(p−1)!+1必须满足(p−1)!+1≡0modp(p-1)!+1\equiv 0 \mod p(p−1)!+1≡0modp,这个式子就是威尔逊定理。
题目:hdu2973

Appendix

施工中…\dots…

信息学竞赛中可能用到的初等数论相关推荐

  1. python竞赛_浅谈Python在信息学竞赛中的运用及Python的基本用法

    浅谈Python在信息学竞赛中的运用及Python的基本用法 前言 众所周知,Python是一种非常实用的语言.但是由于其运算时的低效和解释型编译,在信息学竞赛中并不用于完成算法程序.但正如LRJ在& ...

  2. 算法之递推及其应用(递推关系的建立及在信息学竞赛中的应用 安徽 高寒蕊)...

    定义:给定一个数的序列H0,H1,-,Hn,-若存在整数n0,使当nn0时,可以用等号(或大于号.小于号)将Hn与其前面的某些项Hn(0i<n)联系起来,这样的式子就叫做递推关系. 递推关系中存 ...

  3. 信息学奥赛 python 教程_Python在信息学竞赛中的运用及Python的基本用法(详解)

    前言 众所周知,Python是一种非常实用的语言.但是由于其运算时的低效和解释型编译,在信息学竞赛中并不用于完成算法程序.但正如LRJ在<算法竞赛入门经典-训练指南>中所说的一样,如果会用 ...

  4. 初中信息学c语言组竞赛ppt,论C语言在信息学竞赛中的应用-Read.PPT

    论C语言在信息学竞赛中的应用-Read 论C++语言在信息学竞赛中的应用 浙江省余姚中学 韩文弢 关于信息学竞赛 信息学竞赛一般要求在一定的时间内,理解并分析题意,设计符合给定时间和空间复杂度要求的算 ...

  5. {分享}《Matrix67:信息学竞赛中可能有用的概率学知识》——Monty Hall问题

    嗯,能算半篇水文,写得不好请见谅. <信息学竞赛中可能有用的概率学知识> 内容太多了不打算都写,只写一个刚刚搞懂的问题--<Monty Hall问题>. 对于这个问题,十年来涌 ...

  6. 两极相通——浅析最大—最小定理在信息学竞赛中的应用

    目录 简介 1:Konig定理 最小顶点覆盖: 最大匹配数: Konig定理的证明 2:最大流-最小割定理 3:实战(HDU3870) 题意 题目分析 代码 简介 本文涵盖了周东<两极相通--浅 ...

  7. 【学习笔记】信息学竞赛中的概率与期望小结

    信息竞赛--概率与期望 事件 事件的蕴含.包含 事件的互斥 事件的对立 事件的和(并) 事件的积(交) 事件的差 概率 事件的独立性 全概率公式 贝叶斯公式 概率DP(竞赛中的考察) 期望(竞赛中的考 ...

  8. 信息学竞赛中常用名词

    文章目录 AC WA RE CE TLE MLE PE OLE 信息学竞赛中AC.WA.RE.CE.TLE.MLE.PE.OLE.分别什么意思 AC Accepted 答案正确/通过 WA Wrong ...

  9. 浅谈格雷码(Grey Code)在信息学竞赛中的应用

    1.格雷码的概念 1.性质 格雷码(Grey Code),又叫循环二进制码或反射二进制码,是一种编码方式,它的基本特点是任意两个相邻的格雷码只有一位二进制数不同. 常用的二进制数与格雷码间的转换关系如 ...

最新文章

  1. Binary Differences
  2. 你所不知道的 Android Studio 调试技巧
  3. fofa 搜索结果提取技术分析
  4. python3.5安装教程-linux下安装python3.5.3的方式
  5. 机器学习如何选择模型 机器学习与数据挖掘区别 深度学习科普
  6. 数学建模:1.概述 监督学习--回归分析模型
  7. C# 基础知识 (四).C#简介及托管代码
  8. php调整表格样式,表格的创建以及样式修改
  9. Pandas数据类型及操作
  10. Leaflet使用vector tiles 标注label设置
  11. python+selenium笔记(一):元素定位方法
  12. ubuntu13.04中把ibus中的中文拼音输入设为默认
  13. weblogic发序列化命令执行漏洞工具分享
  14. JS-两个空数组为什么不相等?
  15. 基于C语言开发的教师管理系统
  16. mysql注入转义绕过_SQL注入防御绕过
  17. Spark3.0核心调优参数小总结
  18. 雪豹安装光盘 苹果mac 下载
  19. A. ConneR and the A.R.C. Markland-N-----思维/水
  20. CSS常用英语词汇大全

热门文章

  1. 【Locust】新版本locust使用入门到分布式,附带脚本模板,复制即用。
  2. 服务器共享文件夹限制容量,.如何限制共享文件夹大小.doc
  3. 天宇优配|A股迎来“重要转折” 私募机构投资信心与仓位同步走高
  4. miix4 装linux,联想miix4笔记本u盘安装win7系统步骤
  5. visual studio 2022安装报错未能安装包“Microsoft.VisualStudio.Debugger.JustInTime.Msi,version=17.1.32112.364,ch
  6. 脉冲神经网络:MATLAB实现脉冲神经网络(Spiking Neural Network,SNN) 用于图像分类(提供MATLAB代码)
  7. 广东省梅州市谷歌卫星地图下载
  8. GdPicture.NET SDK Crack,编辑、捕获或打印文档
  9. PCF8591 ADC 模数转换模块使用
  10. 【制造业】-供应链数据指标体系最佳实践