2021杭电多校10 D.Pty hates prime numbers题解

news/2024/11/10 13:02:27/文章来源:https://www.cnblogs.com/TJUHuangTao/p/18301748

前言

暑期第三次组队赛是选的21年杭电多校10,遗憾爆0,被对面队打爆,赛后狠狠补题。这道题的题解,以及网上搜到的其他题解看了好久没看懂,在问了队里大腿多次后,总算磨出来了,这里讲一下我的理解。

题意

多次询问,每次给定 \(n\)\(k\), 如果一个数的质因数里包括前 \(k\) 个质数,则这个数是 讨厌 的,问 \(1\)\(n\) 中有多少个数是不讨厌的。
数据范围 \(1 \leq n \leq 10^{18}, 1 \leq k \leq 16\)

思路

首先直接 \(2^k\) 的枚举质因数,然后容斥,这个是简单的。具体来说就是直接dfs 爆搜,枚举每个质因数选或者不选,选的话就乘上这个数,最终得到一个 \(x\) 以及 容斥系数 \(f\) ,容斥系数根据选的质因数的奇偶性,决定是 \(1\) 或者 \(-1\)。然后将答案加上 \(1 - n\) 中是 \(x\) 的倍数的个数乘 \(f\)

通过这个容斥, 我们能得到的是 1 - n 中不是前k个质数倍数的个数,这句话,以及题解里面也是类似的描述,有一点歧义的地方。不是前k个质数的倍数,意思是质因数不包含前 k 个质数。而不是,不是前k个质数的乘积的倍数(因为题解里面多次强调了前8个质数的乘积9699690,就容易误解不是前8个质数倍数,指不是9699690倍数)。

然后因为 \(k\) 的数据范围是16,所以直接这样 \(2^k\) 容斥枚举是T的,因为多测次数很多。所以正解的思路是,先对前8个质数进行容斥枚举,预处理出一个数组 \(sum[i]\) 表示 \(1\)\(i\) 中,质因数不包含前8个质数的数字个数。然后只对第 \(8\) 到第 \(k\) 个质数进行枚举容斥。

就是这个什么叫只对后面几个数进行容斥,把我控了很久,因为普通的容斥,肯定是考虑前面和后面,总的选的数的个数,决定正负啥的。

然后我是这样去理解:
对一些位去容斥,最终目的是为了求出,1 - n 中不包含这些质因数的数字个数。然后我们对 9 到 k位去容斥,所以保证了这些数一定不包含9 到 k个质因数,然后我们只需要再保证这些数不包含前8个质因数,那这些数就是符合题意的。换言之,就是在容斥后几位的同时,保证能忽略掉前8位的影响。

然后具体的,由于容斥过程中,我们枚举了哪些质因数得到乘积 \(x\) 之后,我们要求的反而是 \(1 - n\) 中是 \(x\) 的倍数的个数。

因为是对后几个质因数容斥,所以我们要求的是 \(1-n\) 中是枚举到的后几个质因数的倍数的个数,因为忽略了前8位,所以我们还得保证求出来的这些数不能有前 8个质因数。也就是,通过容斥计算 \(1-n\) 不含后几位质因数的数量,在整个容斥过程中,还保证了全程枚举到的数不包含前 \(8\) 个质因数,所以最终算出来的就是前 \(k\) 个质因数都不包含的总数。

在后几位的容斥过程中,假如枚举到的乘积是 \(x\) ,问题转化为求 \(1-n\) 中是 \(x\) 的倍数,并且不包含前 \(8\) 个质因数的数字个数。
由于是 \(x\) 倍数,所以这些数 \(x, 2x, 3x \dots\) 一定能表示成 \(kx (1 \leq k \leq \lfloor \frac{n}{k} \rfloor)\) ,因为 \(x\) 是后几个质因数倍数,所以肯定不含前 \(8\) 个质因子。所以我们相当于,求 \(1 - \frac{n}{k}\) 中,有多少个数不含前 \(8\) 个质因数,这个问题等价于求 \(n_1 = \frac{n}{k}, k_1 = 8\) 的子问题了。所以可以预处理 \(k=8\) 的所有答案。

然后由于 \(n\) 很大,没办法预处理 \(n = 1 - 10^{18}, k = 8\) 的所有答案,这时候还需要发现一个性质。 由于前8个质因数的乘积,或者说是最小公倍数是9699690, 假设有一个比较大的 \(n\), 画在数轴上,把有前 \(8\) 个质因数的点 \(i\) 标1,那么显然这些数的 \(lcm\) 就是一个循环节,所以 这个很大的 \(n\) 的答案等于拥有这些循环节的个数乘上一个循环节的答案,加上多出来那一截 \(n \mod lcm\) 对应的答案。(从这个循环节和数轴的角度,感觉比较好理解题解里面那个为什么要取余 lcm)

所以得到题解里面那个式子,这里的答案指的是 \(k = 8\) 时,\(1-n\) 中不含前 \(8\) 个质因数的数字个数。
题解式子
然后就是代码了

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

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

相关文章

DOS命令行

DOS命令行 CMD的方式开始 + 系统 + 命令提示符 Win键 + R 输入CMD打开控制台适用 任意文件夹下面 按住Shift + 鼠标右击点击 + 在此处打开命令行窗口 在资源管理器地址栏加上CMD路径 管理员方式运行:选择以管理员方式运行常用的DOS命令盘符切换:D: 查看文件所有目录:dir 切换…

总表拆分

问题:总表拆分 将以下总表按A列拆分为若干工作表函数法: 新建五个工作表,筛选标题后粘贴到这五个表中 同时选取五个工作表,使用以下公式:=FILTER(总表!A:B,总表!A:A=INDEX(UNIQUE(总表!A:A),SHEET()))数据透视表法: 复制标题1列(条件列),插入数据透视表,复制的标题1列…

基于uniapp+springboot的记账小程序

小程序视频链接:https://www.bilibili.com/video/BV1hi421Y7BE/?vd_source=cd3ceb58125e43fa5f95caf874aec5ef 1.登录 2.注册 3.我的 4.账单 5.记账6.图表 7.明细

计算工作日

问题:当前日期是当月最后2个工作日,则显示次月第一个工作日,否则显示当前日期 函数公式解决:=IF(SUM(N(WORKDAY.INTL(EOMONTH(A2,0)+1,{-2,-1},"0000000",F:F)=A2)),WORKDAY.INTL(EOMONTH(A2,0),1,"0000000",F:F),A2)WorkDay.intl第三参数使用“000000…

推荐几个好用的开源工作流引擎系统

目前基于Java语言开发的主流开源工作流引擎有osworkflow、jbpm、activiti、flowable、camunda。其中osworkflow、jbpm技术较老已经过时,activiti包括activiti5、activiti6、activiti7三个版本,flowable分开源版和商业版,camunda包括camunda7和camunda8两个系列的版本。这么多…

添加友情链接~

欢迎添加友链本文介绍下友情链接 ‍ 什么是友情链接 引自百度百科:友情链接也称为友链、交换链接、互惠链接、互换链接等,是具有一定互补优势的网站之间的简单合作形式,即分别在自己的网站上放置对方网站的 LOGO 或网站名称并设置对方网站的超级链接,使得用户可以从合作网站…

查找的问题

问题:根据片区名称和项目名称找出右表中对应的数据函数公式解决:油腻套路 =VLOOKUP($B$2,$G$5:$S$7,ROW(A1)*4+COLUMN(A1)-3,) 清新套路 =WRAPROWS(XLOOKUP(B2,G5:G7,H5:S7),4)ROW(A1)*4+COLUMN(A1)-3右拉下拉生成第一行2、3、4、5第二行6、7、8、9第三行10、11、12、13的序列…

重复的第二行前插入一行

问题:在重复序列数的第二行前插入一行Countif+查找法: 使用以下公式返回每个值出现的次数=COUNTIF(A$3:A3,A3)选取B列》查找》查找内容:2》查找范围:值》查找全部Ctrl+A选取所有查找结果后关闭查找对话框 在单元格上方插入一行 纯公式法:=LET(x,A3:A13,y,SORT(VSTACK(UNIQ…

OpenFeign 服务调用与负载

需要建两个工程,一个是服务提供者,一个是服务调用者 服务提供者 一个普通的 nacos 服务,增加一个 controller 方法即可,上一篇文章刚说了,这里简单说下 <!-- 服务提供者不调用其他服务,所以只需要注册到 nacos 的依赖 --> <dependency><groupId>com.al…

STMF4串口通信使用

目录STMF4串口通信使用USART的使用流程注意 STMF4串口通信使用前提回顾: 串口通信概念介绍1 STM32串口通信概念介绍2 针对特定stm32F4板子的串口接线折叠文本 USART指的是通用同步异步收发器,是STM32中的串行通信设备,STM32F407ZET6一共提供了6个串行接口供用户使用,其中4个…

HarmonyOS NEXT 学习笔记3--登录页面(数据绑定)

HarmonyOS NEXT 学习笔记3--登录页面(数据绑定)1.代码: import { promptAction } from @kit.ArkUI@Entry @Component struct Page_textInput_onchange {// @State UI刷新测试 [注意:不是双向绑定]username: string = password: string = build() {Column({ space: 20 }) {Te…

vue.js下载安装

参考—— https://www.jb51.net/article/283884.htm注:使用的是vue2 进入官网  https://cn.vuejs.org/ 文档——》vue2文档 或者直接通过这里    https://v2.cn.vuejs.org/v2/guide/ 复制绿色部分,粘贴到浏览器https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js 在在项目…