积性函数
定义
- 若
的定义域为正整数域,值域为复数,即 ,则称 为 数论函数。 - 若
为数论函数,且 ,对于互质的正整数 有 ,则称其为 积性函数。 - 若
为积性函数,且对于任意正整数 都有 ,则称其为 完全积性函数。
性质
- 对于任意积性函数
- 对于任意积性函数
, 依然是积性函数
积性函数的例子
- 除数函数
- 约数个数函数
- 约数和函数
- 欧拉函数
- 莫比乌斯函数
- 元函数
完全积性 - 恒等函数
完全积性 - 单位函数
完全积性 - 幂函数
完全积性
欧拉函数
定义
对于正整数
通项公式:
性质
以下不特加说明,默认
证明:
小于
的数一共有 个,其中不与 互素的数的个数为 ,一共 个令
的质因数分解形式为 ,则证明:
欧拉定理:如果
互质,则一定有费马小定理:
证明:
如果
,则由此可知,与
互质的数成对存在,并且先加等于若
,则 ,否则参考通项公式
若
,则结论显然,所以下面只考虑 和 不互质的情况我们考虑将
写成那么
相当于而
正好等于后面那个多余的东西的倒数狄利克雷卷积的结果
线性筛求欧拉函数
1 | void init_phi(int n) { |
莫比乌斯函数
定义
性质
证明:
注意到上式左边是求无平方因子的数的个数,我们令
表示最大的整除 的平方因子那么左式等价于
我们注意到当
含有平方因子的时候 ,当且仅当 不含平方因子的时候那么这时候一定有
,我们知道 一定不含平方因子,所以可以直接那么我们有
狄利克雷卷积的结果
狄利克雷卷积
定义
设
性质
- 交换律
- 结合律
- 加法的分配率 $$
- 两个积性函数的狄利克雷卷积仍然是积性函数
- 积性函数的逆元仍然是积性函数
- 积性函数相乘仍然是积性函数
- 如果
为完全积性函数, ,
逆元
对于数论函数
对于数论函数
常用的狄利克雷卷积
狄利克雷前缀和
大概就是令
1 | for (int i = 1; i <= cnt; ++i) |
线性筛
如果一个积性函数在素数的答案可以简单求得,且其最小质因数的次数不为一的时候的答案也可以简单计算,那么我们可以直接用线性筛
1 | void init_phi(int n) { |
否则就要麻烦一点,先求出这个积性函数在
以
注意到这样做的时间复杂度仍然是
1 | void init_isp(int n) { |
杜教筛
众所周知,积性函数前缀和可以
不妨设所求为
即
如果我们能快速的计算
关于杜教筛的一些时间复杂度:
- 预处理前
项,时间复杂度 - 不预处理前
项,时间复杂度 - 数论分块套数论分块,不预处理时间复杂度
,预处理时间复杂度 - 数论分块套杜教筛,时间复杂度
以
1 | namespace D_Seive { |
有的时候,
Min_25筛
简介
时间复杂度为
推导过程
下文中,我们令
大概就是将
至于如何计算这几个部分,我们考虑构造函数
这个东西就是我们只算所有的素数以及最小质因子大于第
容易得到
简单来讲就是
然后我们再构造一个函数,
容易得到
大概就是分成两部分,第一部分是大于
最后的答案显然就是
模板
求积性函数
1 | ll id1[maxn], id2[maxn]; int Sn; |
powerful number筛
简介
powerful number:每个质因子次数都不为
设
模板
1 | ll dfs(int k, ll m, ll h) { // 枚举所有 powerful number |
递推
1 | ll dfs(int k, ll m, ll h) { |
例题
简要题意:求
简要题解:
预处理后可以做到单次简要题意:
简要题解:
预处理后可以做到单次简要题意:
简要题解:
预处理后可以做到单次简要题意:
简要题解:
预处理后可以做到单次简要题意:
简要题意:
可以做到
简要题意:给定
,求所有长度为 的 串的价值总和,一个 串的价值定义为 ,其中 是这个 串的最小周期简要题解:
,也就是说 ,可以直接上杜教筛简要题意:定义积性函数
,且 ,求 简要题解:直接上
筛简要题意:求
的素数个数简要题解:我们令
,这东西显然是完全积性函数,然后直接 筛即可简要题意:给定
,求 简要题解:注意到
,对于 我们可以考虑用 筛我们令
,这个东西显然是积性函数,且简要题意:求
简要题解:
我们考虑后面那个东西
,这个东西就是 显然等于那么我们只需要求
注意到这个东西就是
,这是个狄利克雷后缀和的形式,可以做到简要题意:求
,其中 当且仅当 无平方因子时为简要题解:
我们令
, , ,容易得到后面那个东西显然是
,对于 ,当 时为 ,这个东西可以线筛另外自然数幂和也可以线筛,因为他是完全积性函数,可以做到
预处理,单词询问简要题意:求
简要题意:我们考虑单独算每个质数
的贡献我们注意到
太难计算,考虑换成 的方式来计算对于一个
的 元组,我们考虑分别算 次贡献,每次贡献为 ,那么我们可以这样计算贡献,令 表示 的 元组个数,这样一个 的贡献就是 容易得到
, 这个整除启示我们进行数论分块我们可以预处理出前缀
的 的乘积,然后就可以直接数论分块,另外对于 我们直接对 取模即可,预处理 ,单次询问 简要题意:给定一个长度为
的排列 ,求简要题解:首先我们划一下式子,这里扔掉
,我们采用 而不是 ,能够得到我们考虑对于一个
,不妨设有 个 ,那么贡献就是 ,用类似的式子化简可得我们考虑一个暴力,暴力枚举
,然后暴力枚举这 个 ,然后对于这些 ,暴力枚举约数容易得到时间复杂度为
,根据排序不等式,这个东西就是 简要题意:求
求
简要题意:注意到后面的式子像是在枚举
为 的二元组 ,我们按照这个思路化简式子 ,这个式子我们就很熟了容易得到
,这个东西可以直接数论分块加杜教筛,复杂度仍然是简要题意:给定
和 ,有 次操作,每次操作要么给出 ,对于所有 的 加上 ,要么给定 ,查询简要题解:我们考虑对于位置
,我们的加上 ,按照莫反的套路得到 我们考虑枚举
的约数,然后对于所有 的倍数都加上 ,我们可以将倍数增加,改成单点加,这样我们在查询的时候需要查询约数和,这里的复杂度为那么前缀和的形式变成了
,我们数论分块,复杂度仍然是总的时间复杂度
,似乎有 的做法简要题意:求
简要题解:
转指数上 是常见套路可以做到预处理
,单次 简要题意:给定
,每次随机选择一个 到 的整数,与手上的数取 ,求期望多少次手上的数变成简要题解:令
表示 变成 的期望次数,容易得到 这个式子拿莫反变一下能够得到
,后面的那个东西我们令其为然后我们在求
的时候只需要枚举约数即可,需要注意要把 提出来,算完 再更新 即可时间复杂度 简要题意:给定
,求 简要题解:我们首先对
下手,注意到该式等价于 ,这个变换再次展示了 和 的巨大区别 = =那么我们现在的式子就是
,我们变换一下次序,容易得到 ,指数上那个东西我们可以看成函数 ,那么答案就是这个东西 ,暴力算的话数论分块套数论分块的复杂度是 的,不能通过此题,但我们预处理 的前 项就能做到总的时间复杂度为
简要题意:给定
,对于一个长度为 的序列 , 的每一位都是 ,如果整个序列的 小于等于 ,且整个序列的 大于等于 ,那么这个序列是合法的,每个合法序列的价值是 ,求所有合法序列的价值的和简要题解:注意到一个序列的
一定是 的约数,所以我们考虑直接求 表示 为 , 为 的合法序列的价值的和,这样我们再搞一个调和级数的枚举就能求出所有合法的对于
,显然我们不太好直接操作,我们考虑求 ,即求 为 ,且 是 的约数的合法序列的价值的和,我们尝试列一下 的式子显然这个东西我们可以用调和级数的做法算出
到 ,然后用作经典的莫比乌斯反演,我们能算出 ,但是现在我们注意到我们只计算了 小于等于 的情况,但题目实际要求 大于等于 的情况,正难则反,我们求出只有 的要求下的所有答案,简单 小于 的即可,所有东西的 次方都可以预处理,时间复杂度简要题意:给定
,求 ,其中 是积性函数,且 ,答案对质数 取模简要题解:看到
的式子,容易想到 ,但是 加上需要用龟速乘导致 等一类亚线性筛跑不动,我们考虑 筛,构造函数 ,可以求得 , 的前缀和可以 求,那么我们的时间复杂度为简要题意:现在有
次询问,每次询问给定 求简要题解:我们根据
,根据这个化简我们可以得到 ,其中 ,注意到所有合法的 都满足 ,那么总共只有 个 ,且可以 预处理但是只预处理
我们依次询问也只能做到 ,不能通过此题我们考虑预处理
的前缀和,我们只预处理 的前缀和,这一部分的时间复杂度大概是 的,那么在询问的时候我们考虑对于 的 暴力算,这样的 只有 个,求一次的时间复杂度为 ,那么总的时间复杂度为 ,我们取 为 左右可以通过此题简要题意:给定
,求简要题解:经过简单的式子化简,我们可以得到
,其中我们考虑直接枚举
这个东西的时间复杂度是 , 显然是一个等比数列求和东西,我们直接套用等比数列求和的公式的话的时间复杂度为 ,总的时间复杂度为但是我们注意到
的前缀和最多才到 项,如果我们计算这部分的时间复杂度是 应该能显著减少常数,同时我想起来等比数列前缀和(n项)有 的做法,然后我们把这个做法套上去,发现这样就过了但其实
,感觉非常神奇简要题意:给定一个长度为
的序列 ,求简要题解:注意到
的值域很小,我们考虑一个针对值域的做法,首先我们把所有 的约数都求出来,令其为集合 ,那么最终的答案一定为从 中选出两个互质的数的最大 ,我们考虑二分 ,那么如果 ,按照莫比乌斯反演的套路,我们得到 ,我们枚举 ,后面枚举 之后是一个双指针,总时间复杂度为其实这题还有一个
的做法,我们还是考虑对 求 ,我们维护一个栈,从大到小加入数 ,如果栈中存在一个 与 互质,那么对于 , 一定没用了,因为我们现在的答案至少是 ,而后面加入的数 与 的答案至多是 ,所以我们可以一直弹栈顶直到栈中不存在与 互质的数,那么我们如何判断是否存在于 互质的数呢?答案还是莫反,我们有 ,其中 表示有多少数是 的倍数,这个东西可以在入栈和出栈时顺便维护,时间复杂度简要题意:给定两个长度为
的序列 ,求长度为 的序列 ,其中简要题解:我们考虑只统计
的答案,对于 的答案我们只需要交换 和 重新求一次即可,另外我们只考虑 的情况,对于 的情况,我们只需要将 和 都除掉 即可首先我们将
按升序排序, 按降序排序,那么我们考虑维护一个当前有效 的集合 ,我们当前枚举到 ,我们考察集合 中是否有与 互质的 ,如果存在这么一个 ,那么集合内所有小于 的数都没有用了,原因我们可以这样考虑对于我们接下来枚举到的 ,其与 所组成的答案一定小于 和 组成的答案,那么我们的做法就是每次删除 中与 互质的数 以及小于 的数,注意到我们在一开始就完成了所有 的插入,所以我们可以维护一个栈来代替集合,至于如何判断是否存在与 互质的数,通过莫反,我们发现只需要 , 表示 中是 的倍数的个数时间复杂度
,似乎还有比较好想的 的二分做法2018-2019 Summer Petrozavodsk Camp, Oleksandr Kulkov Contest 2 B Yet Another Convolution
简要题意:给定
,求简要题解:我们知道
,那么我们容易化简得到 ,后面那两个 ,如果我们套用传统的 去化简的话是不容易处理的,但我们注意到 的上指标相同,能够想起一个经常被遗忘的式子 ,我们令
表示 的前缀和,那么原式就是 ,相当于是一个数论分块套杜教筛,时间复杂度为The Hangzhou Normal U Qualification Trials for ZJPSC 2021 B Baom and Fibonacci
简要题意:给定一个长度为
的序列 和两个整数 和 ,求有多少数对 满足存在一个整数 ,使得 ,同时简要题解:我们考虑如果存在一个数对,那么一定满足
,我们令 表示 的素数集合,然后我们对于每个素数单独考虑,对于一个素数 ,我们令 表示 的次数, 表示 的次数, 表示 的次数, 表示 的次数,那么对于 的情况我们一定可以选出一个 ,对于 ,通过讨论我们发现, 和 两者必须至少满足一个我们才能找到合法的另外我们发现
范围内的数最多只有 个质因子,我们状压一下,相当于求 ,这个东西拿高维前缀和求一下即可,时间复杂度简要题意:给定一个长度为
的序列 ,求简要题解:我们直接化简
注意到我们只需要预处理
和 即可,后面那个东西本质和前面的一样,时间复杂度简要题意:给定
,求 ,其中 表示 的非严格次大质因数,例如简要题解:我们考察
的过程,发现在求 的时候,我们枚举最小质因子 时,如果这个 有贡献,那么说明剩下数字是质数,那么我们需要 ,这些都可以在 的时候求出