数论 工具 线性筛

由于做莫反题需要大量的基础函数知识,于是有了这篇文章将我做到的函数都记录下来。

持续施工中。


约数和函数 \(\sigma\)

定义:\(\sigma(x)=\sum_{d|x} d\)

证其为积性函数:

\(x=\prod p_i^{a_i}\),设 \(d\)\(x\) 的质因数个数,那么发现:

\[\begin{aligned}\sigma(x)&=\sum_{i_1=0}^{a_1}\sum_{i_2=0}^{a_2}\cdots\sum_{i_d=0}^{a_d} p_1^{i_1}p_2^{i_2}\cdots p_d^{i_d}\\&=\sum_{i_1=0}^{a_1} p_1^{i_1}\sum_{i_2=0}^{a_2}p_2^{i_2}\cdots \sum_{i_d=0}^{a_d}p_d^{i_d}\\&=\prod_{i=1}^d \sum_{j=0}^{a_i}p_i^j \end{aligned} \]

我们发现当 \(d=1\) 时,\(\sigma(x)=\sum_{i=0}^{a_1} p_1^i\),即上述式子可以转化为:

\[\sigma(x)=\prod_{i=1}^d \sigma(p_i^{a_i}) \]

推广可得:

\[\sigma(a\times b)=\sigma(a)\sigma(b)\quad gcd(a,b)=1 \]

证毕。

接下来考虑如何线性筛。考虑我们当前的数 \(i\),令其最小的质因子为 \(p\)。由积性函数可知,我们需要先使两个数 \(a,b\) 互质,再由 \(\sigma(a\times b)=\sigma(a)\sigma(b)\) 转移。那么我们若想从 \(\sigma(i)\) 转移至 \(\sigma(i\times p)\),需要先将 \(i\) 中所有的质因子 \(p\) 除掉,转移式子即为 \(\sigma(i\times p)=\sigma(\frac{i}{p^{a_1}})\sigma(p^{a_1+1})\)。用 \(low_i\) 维护 \(\sigma(p^{a_1})\),那么 \(low\) 的转移有 \(low_{i\times p}=low_{i}\times p+1\),此时 \(\sigma\) 的转移有 \(\sigma(i\times p)=\frac{\sigma(i)}{low_i}\times low_{i\times p}\)

实现中,当出现 \(i \mod p_j=0\) 的情况就用上述方法转移,否则 \(\sigma_{i\times p_j}\) 直接用积性函数性质求,\(low_{i\times p_j}\) 的值等于 \(\sigma(p_j)\),因为如果此时 \(i\) 中有比 \(p_j\) 更小的质因子的话,早在前面就会被筛出来然后 break 掉。

因为 \(\sigma\)\(o\) 挺像,所以在代码中 \(o_i\) 表示 \(\sigma(i)\)

int pri[N],tot,o[N],low[N];
bool vis[N];
void Wprepare()
{o[1]=1;for(int i=2;i<=N;i++){if(!vis[i]) pri[++tot]=i,o[i]=low[i]=i+1;for(int j=1;j<=tot;j++){if(i*pri[j]>N) break;vis[i*pri[j]]=1;if(i%pri[j]==0){low[i*pri[j]]=low[i]*pri[j]+1;o[i*pri[j]]=o[i]/low[i]*low[i*pri[j]];break;}low[i*pri[j]]=pri[j]+1;o[i*pri[j]]=o[i]*o[pri[j]];}}
}

例题是 [SDOI2014]数表,莫反部分不难,难点在理解如何筛约数和以及动态维护某个函数前缀和,练习 \(\sigma\) 函数的好题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/796443.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?

文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备 免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 实现技术自由,…

数论 莫比乌斯反演

数论 莫比乌斯反演讲解前置需求 数论分块 概念 对于一个形如 \(\sum_{x=1}^n \lfloor{\frac{n}{x}}\rfloor\) 的式子,我们发现对于一部分的 \(x\),它们的 \(\lfloor{\frac{n}{x}}\rfloor\) 值相同,因此我们没必要 \(\mathcal{O(n)}\) 计算,可以采用数论分块的办法将这一步的…

解决rabbitmq队列超时timeout问题【win环境】

解决rabbitmq队列超时timeout问题【win环境】 1.安装RabbitMQ-Plugins cd C:\Program Files\RabbitMQ Server\rabbitmq_server-3.11.3\sbin rabbitmq-plugins enable rabbitmq_management浏览器打开http://localhost:15672来访问web端的管理界面,用户名:guest,密码:guest进…

低代码 + BI 数字化转型如何助力制造业供应链协同?

引言 在当今快速变化的商业环境中,制造业面临着前所未有的挑战和机遇。全球化竞争、消费者需求的快速变化、技术创新的加速以及不断增加的成本压力,都要求制造企业不断提高其供应链的效率和灵活性。供应链协同作为一种先进的管理理念和实践,正在成为制造业实现数字化转型、提…

10 Windows批处理之调用例程和bat文件

在前文中,我介绍了标签和非顺序执行,这两者在本文中也起着重要作用。我将很快介绍一个已经讨论过的命令的新变化,允许您创建和调用由标签定义的例程。不是简单地在标签之后将控制权交给代码,而是在例程执行后将控制权返回到调用它的位置。在编写更复杂、更有趣的bat文件时,…

pbootcms后台的百度普通收录token怎么填写?怎么获得?

要在PbootCMS后台填写百度普通收录token,你需要先获得这个token,然后按照以下步骤填写到后台: 如何获得百度普通收录token访问百度搜索资源平台打开百度搜索资源平台的网址:https://ziyuan.baidu.com/ 如果你还没有账号,请先注册一个百度账号。添加站点登录后,进入用户中…

PbootCMS实现后台编辑器微信公众号图片本地化

为了实现PbootCMS后台编辑器将微信公众号上的图片本地化,可以按照你提供的方法进行修改。以下是详细的步骤和修改内容: 1. 修改 coreextendueditor/phpction_crawler.php 文件 原始代码/* 抓取远程图片 */ $list = array(); if (isset($_POST[$fieldName])) {$source = $_POS…

市场主体登记

市场主体登记服务 4.0tomcat部署与安装[root@VM-4-9-centos ~]# mkdir /data/soft/ [root@VM-4-9-centos ~]# tar -zxvf apache-tomcat-9.0.68.tar.gz[root@top164 ftpdir]# tar -zxvf apache-tomcat-9.0.68.tar.gz [root@top164 soft]# cp -a cp -a apache-tomcat-9.0.68 apac…

PbootCMS怎么安装?注意事项

安装PbootCMS的过程相对直接,下面是详细的步骤,帮助你完成安装: 1. 下载PbootCMS程序访问PbootCMS官方网站或其他可信来源下载最新版本的程序包。 确保下载适合你服务器环境的版本。2. 上传程序包使用FTP客户端(如FileZilla)或其他方式将程序包上传到你的虚拟主机或服务器…

PbootCMS程序后台登录密码重置工具

如果你忘记了PbootCMS后台的登录密码,可以使用官方提供的密码重置工具来重置密码。以下是使用PbootCMS密码重置工具的步骤: 1. 下载重置工具访问PbootCMS官网或其他可信来源下载密码重置工具。 通常是一个名为 resetpw.php 的文件。2. 上传重置工具将下载好的 resetpw.php 文…

Pbootcms网站忘记后台帐号密码如何重置?

如果你忘记了PbootCMS后台的账号密码,可以按照以下步骤来重置密码: 方法一:使用官方提供的密码重置工具下载重置工具访问PbootCMS官网或其他可信来源下载密码重置工具。 通常是一个名为 resetpw.php 的文件。上传重置工具使用FTP客户端(如FileZilla)将 resetpw.php 文件上…

PbootCMS模板安全设置与加固方法

为了确保PbootCMS模板的安全性和稳定性,可以采取一系列的安全设置与加固措施。下面是一些具体的步骤和建议: 1. 权限设置目录权限:调整关键目录的权限,防止未经授权的写入操作。/apps:禁止写入权限 (chmod 0555) /config:允许读写权限 (chmod 0777) /core:禁止写入权限 …