[探究] OI中各种初级数论算法相关
嗯,写这个是因为我太弱了.
#线性筛素数
嗯,其实对于这个而言,无非就是一个不易理解而已。
if(! (i % prime[j])) break ;
那么我们先来分析线性筛的复杂度,嗯,很显然因为是才称其为线性筛法。所以也就是说,对于每个合数,我们只让它被筛去一次。那么线性筛是如何保证的呢?答:每个合数都会被自己最小的质因子筛掉。
下面让我们来分析合理性,说是证明其实就是逻辑演绎
证明一:在线性筛法中,每个合数都会被自己最小的质因子筛掉。
我们令为一个合数,且他的标准分解式为
不妨令
考虑当用 筛除时,令
那么会因为会第一次被使用而使得被成功筛掉(的值无关紧要,即无论是否是的倍数,只会在这之后跳出)。但是我们考虑,如果用筛除的话,那么若令
则一定有
从而会使得在刚枚举到还未枚举到时跳出,使其不能被筛掉。
所以得出结论,在线性筛法中,每个合数都会且仅会被自己最小的质因子筛掉。
证明二:线筛中,每个合数当前不被筛的原因是因为它要被放到之后去筛。
对于的两个因子,他们会分别在和时筛掉,因为,所以会有。结合证明一,由于一定会被最小的筛除,所以可以得出此时的一定为最大,所以必须等到所枚举的更大时,才会被筛除。
#欧拉筛
首先我们需要有一个前置技能:
那么类比线性筛而言,我们可以发现,对于一个素数而言,,那么因为凡是素数必然在合数之前被筛到,所以我们可以考虑以此为基进行欧拉筛。那么,由于若且,就会有,所以有
else
phi[i*prime[j]]=phi[i]*phi[prime[j]];
那么对于另一种情况,而言,我们考虑有且其中
那么此时就会有
而因为事实上$$\varphi(j{n})=jn-j^{n-1}$$
故$$\varphi(x) \times (j{n-1}-j)=\varphi(x) \times \varphi(j^{n-1})= \varphi(i)$$
所以会有$$\varphi(w)=\varphi(x) \times j\times(j{n-1}-j)$$
所以:
if(i%prime[j]==0)
{
phi[i*prime[j]]=prime[j]*phi[i];
break;
}
#线性推逆元
首先来思考逆元是个什么东西:
若 ,且 与 互质,那么我们就能定义: 为在的逆元,记为
再来思考逆元有个什么鬼用处:
对于 ,我们就可以求出 在 下的逆元,然后乘上 ,再,即可得出结果。
好的那么我们来看一下这玩意儿怎么线性推:
首先我们令
然后显然的是
两边同时乘上和
移个小项
换个元
于是就华丽丽地结束了
inv[1]=1;
for(i = 2; i <= n; i ++)
{
inv[i] = - (p / i) * inv[p % i] ;
inv[i] = (inv[i] % p + p ) % p ;
}
#欧拉公式
欧拉公式是世界上最美妙的公式 ——苏格拉底【雾
首先让我们来看看这个公式的样子:其中为复数单位:
那么它美妙在哪里呢?我们会发现它联系了最重要的无理数之一——、复数域和基本初等函数、这些东西,所以被冠以“最优美、最伟大桥梁”、“数学上的天桥”等美称。
但是这远远不是最美妙的,最美妙的是,当你取时,会有还有什么比这更美妙吗?我们通过这个公式,成功地将两个最重要的超越数和、复数中的“地基”、自然数中最美妙的和,在这一个公式中被我们尽收眼底!
那么,现在有没有引起你的兴趣?如果有,我们来看证明吧:
首先我们需要前置技能——泰勒展开。
泰勒公式是将一个在处具有阶导数的函数利用关于的次多项式来逼近函数的方法。
若函数在包含的某个闭区间上具有阶导数,且在开区间上具有阶导数,则对闭区间上任意一点,成立下式:
——百科
这就是泰勒展开式,正确性证明暂时不会,右边的那个幂级数又叫做泰勒级数,我们可以理解为我们把某些特定的函数展开成了幂级数的形式。
:如果无法理解的话……看高数去吧!【下册即可
好啦,扯这么多其实就是说,我们右边的、都是可以被展开……换种方式表示的.
那么他们展开之后大约是这样子:$$\forall x, sinx = \sum\limits_{n = 0}{\infty}{\frac{(-1)n}{2n + 1}!x^{2n + 1}}\forall x, cosx = \sum\limits_{n=0}{\infty}{\frac{(-1)n}{2n}!x^{2n}}$$
等式左边$$e^x = \sum\limits_{n=0}{\infty}{\frac{1}{n!}}i1 = i,i^2 = -1, i^3 = -i, i^4 = 1.....$$那我们的左边可以得到
而因为对于和的泰勒级数我们可以写成这样:
所以有
证毕。
如果你细心+聪明的话,会看到无理数的递推公式哦!
# 数论分块
好的,数论分块也叫做整除分块,是数学问题中一个优化时间复杂度的技巧,通常解决的是一个子问题——没错,是用来解决一个很常见的子问题,或者与其相似的子问题。
也就是说大部分情况他就只有一个用处:
求并要求复杂度
这个问题优化的方向是缩小规模——之所以可以缩小规模,是因为我们发现原来当 的时候,、以及的值都一样,于是我们思考可以分块乱搞一下。那么分块怎么分块呢?我们可以有以下这个程序:
for(l = 1 ; l <= N ; l = r + 1){
r = N / (N / l) ;
Ans += (r - l + 1) * (N / l) ;
}
看起来……比较明朗的是这确实是一个分块,并且跟我们上文提及的指导思想十分的相似……
你还是不知道他到底是怎么分的块
那么精彩的证明就要开始了惹~
先证一下“指导思想”
这个应该是复杂度的证明
命题:其中表示整值多项式的值域大小。
(人话版本:我们接下来要证明 最多有种取值,也就是证我们最多要进行的运算次数是级别的)
以下是证明:
我们分成两种情况来考虑: 和
我们先思考简单点的,当时,此时对于全部的最大不会超过 ,所以其取值不会超过的级别。
那么对于的情况,我们思考去证明另一件事——证明
那么我们此处不妨用反证法,假设.我们不妨令 ,则我们可以得到 继而得到
那么根据假设,我们很显然会有
也就会有下面这个等式 但是因为我们已经证完了的 所以等式左边一定不会等于等式右边……所以出现矛盾。
那么我们就通过反证法证明了结论,从而有几个不同的就会有几个不同的取值。
所以得出结论,
好的,刚才的证明和正确性没啥关系……好吧跟时间复杂度的正确性有关系……那就跟正确性有关系好了……我在说些什么奇怪的东西……2333333333333333333
接下来证明那一句玄学的
r = N / (N / l) ;
再证一下正确性
首先我们意会一下……我们所做的工作,就是要找出极小的和极大的,对于给定的有$ c \in [l,r]\lfloor \frac{n}{c} \rfloor = \omega$ 。那么根据我们上一个证明中的下半部分我们可以知道,这就是一个极大块,并且下一个极大块是从开始的,因为极大块必然满足.
那么我们要找的就是每个极大块的右断点。
命题:如果已知,那么满足的最大的满足
(其实这个玩意儿是可以意会出来的)
以下是证明:
我们不妨继续分类讨论:
当时:
不妨继续设
那么我们可以得到比较显然的结论是且因为当时,互不相同,所以,我们只需要证明 而这个结论是显然的。因为 ,所以得证
当 时:
直接证似乎不是很容易,那么我们思考一个转化。因为对于一个我们要证明的有两个性质:并且
那么由于 所以我们不妨把要求的换成 并说明并且
而此时由于, 所以我们发现原来就是当时的结论。于是我们就无比迅速地得到了并且由中的结论推出了。
于是乎:
那么我们就证完了!想不到这个这么显然的结论这么好背的结论居然是迄今为止这篇博客中我花费心血最多的……
嗯,我被自己帅到了嘿嘿~
# 阿克曼函数相关
不知道为什么就开始颓这个函数……
感觉很牛13的样子……
以下大部分内容来自(主要是智障楼主找不到更好的材料了)
首先我们先解释一下箭头表示法这个东西(一时编不出什么更好的名字)
我们用表示“迭代相乘”,譬如说表示,而则表示。
同时,我们用表示“迭代取幂”,它的意思是 ,等式右边一共有 个。
同时,我们用表示“迭代迭代取幂”……
好吧,其实这玩意儿是递归定义的,借鉴的的我承认……
那么这东西用处是啥呢?其实我们如果用它来表示大数的话,是比科学计数法更容易的,比如就看起来很繁琐是吧
那么接下来,我们来介绍真正地函数。很巧的是,这东西也是递归定义的:
并且,这东西十分的大,当的时候就已经十分不可算了,因为事实上,不知道会不会爆
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫