传送门

变态数学题(主考位运算与素数筛)。

读完题看起来有点难做,因为质数的出现是根本没有可以使用的规律。暴力的话也很好想,枚举 $y$。但是肯定会超时。我们也可以换个方向枚举。对,筛出素数,再返过去判断有多少个素数符合条件,但任然会超时。

再思考一下,$x$ 异或上什么样的数才能使结果小于 $x$?

注意下面的步骤需要草稿纸推演,不然会有点难理解。

我们设符合条件的素数为 $k$ ,我们设 $k$ 的二进制中最高位是第 $M$ 位,不难发现,只有在 $x$ 的第 $M$ 位上也是 $1$ 的时候,$k$ 异或 $x$ 的结果小于 $x$(这一步若实在想不通的可以拉到文末,查看证明过程)。

随即。我们用素数筛,并统计范围内所有素数的最高位是哪一位,对于每个询问把 $x$ 每位拆开,若发现某一位是 $1$,则加上桶里已经计算好的,二进制数该位为 $1$ 的素数个数。

代码奉上:

#include<iostream>
using namespace std;
int T,n,m,ans;
int zhi[2000010],cnt[26];
bool f[2000010];
void IAKchuanzhibei(){
//素数筛 (欧拉筛法)
for(int i=2;i<=2000000;i++){
if(!f[i])zhi[++m]=i;
for(int j=1;j<=m&&i*zhi[j]<=2000000;j++){
f[i*zhi[j]]=1;
if(!(i%(zhi[j])))break;
}
}
//开桶记录
for(int i=1;i<=m;i++)
for(int j=25;j>=1;j--)//由于1000000内最大的质数为999983,转成二进制为1111 0100 0010 0010 1111,共24位,为保险起见,这里从25开始计算
if(zhi[i]&(1<<(j-1))){
cnt[j]++;//计算当质数为j位时,一共的个数
break;
}
}
int main()
{
//预处理
IAKchuanzhibei(); cin>>T;
while(T--)
{
cin>>n;
ans=0;
for(int i=25;i>=1;i--) if(n&(1<<(i-1))) ans+=cnt[i];//加上所有符合条件的素数
cout<<ans<<endl;
}
return 0;
}

证明过程:

观点一:那么 $k$ 异或 $x$ 的结果从 $M+1$ 位开始与 $x$ 的 $M+1$ 位开始的部分相同。因为 $k$ 的 $M+1$ 位以上的部分均为 $0$,因为 $1$ 异或 $0$ 的结果为 $1$,$0$ 异或 $0$ 的结果为 $0$,所以保持不变。

观点二:那么重点来到 $M$ 位,由于 $k$ 的 $M$ 位一定为 $1$,那么如果 $x$ 的 $M$ 位也为 $1$,异或一下结果为 $0$,即小于原来 $x$ 的 $M$ 位,那么异或的结果一定小于 $x$。若 $x$ 的 $M$ 位为 $0$,则反之。


我们设 $x=13$,并拿质数 $3$ 和 $5$ 举例。

$13$ 的二进制:$1101$。

$3$ 的二进制:$0011$ 异或结果:$1110$。

前两位与 $1101$ 相同(观点一)。

第二位($M$ 位)为 $1$,大于原来的 $0$。所以无论后面几位为什么,异或结果都比 $1101$ 大。(观点二)。


$5$ 的二进制:$0101$ 异或结果:$1000$。

前一位与 $1101$ 相同(观点一)。

第三位($M$ 位)为 $0$,小于原来的 $1$。所以无论后面几位为什么,异或结果都比 $1101$ 小。(观点二)。

P8842 [传智杯 #4 初赛] 小卡与质数2的更多相关文章

  1. P8844 [传智杯 #4 初赛] 小卡与落叶

    简要题意 给出一个 \(n\) 个节点的以 \(1\) 为根的树,每一个节点 \(i\) 带权 \(w_i\),初始时所有节点的权均为 \(0\).有 \(m\) 个操作,支持以下操作: 1 x,对于 ...

  2. P8872 [传智杯 #5 初赛] D-莲子的物理热力学

    题目链接:P8872 [传智杯 #5 初赛] D-莲子的物理热力学 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 参考了题解,自己在这再写一遍 假设数组有序且经过m次操作后的数组最 ...

  3. 第三届“传智杯”全国大学生IT技能大赛(初赛A组)题解

    留念 C - 志愿者 排序..按照题目规则说的排就可以.wa了两发我太菜了qwq #include<bits/stdc++.h> using namespace std; const in ...

  4. 第四届“传智杯”全国大学生IT技能大赛题解

    目录 A B C D E F G 今年题目难度普遍偏低.只有 D,F 还好. A 按题目给的公式计算即可.注意应在最后的答案中去掉小数部分. B 按照题意模拟即可.注意答案要与 \(0\) 取 \(\ ...

  5. P8201 [传智杯 #4 决赛] [yLOI2021] 生活在树上(hard version)

    个人思路: 首先,题目可以转化为是否存在 \(a,b\) 路径上一点 \(u\),满足 \(w_u = dis{1,a} \oplus dis{1,b} \oplus w_{lca(a,b)} \op ...

  6. 传智播客DotNet面试题

    技术类面试.笔试题汇总(整理者:杨中科,部分内容从互联网中整理而来) 注:标明*的问题属于选择性掌握的内容,能掌握更好,没掌握也没关系. 下面的参考解答只是帮助大家理解,不用背,面试题.笔试题千变万化 ...

  7. Socket小项目的一些心得(鸣谢传智的教学视频)

    Socket是一种封装了四层通信的整体抽象入口,通常也称作"套接字",这是常用的四层通信这是访问Socket的流程图,这个分为客户端和服务器端,其中服务器端有以下步骤去建立,前面的 ...

  8. 传智博客(JavaWeb方面的所有知识)听课记录(经典)

    一.       JavaWeb基础 第一天: 1.Eclipse详解: (1).Bad versionnumber in .class file:编译器版本和运行(JRE)版本不符合.高的JRE版本 ...

  9. 传智播客C语言视频第二季(第一季基础上增加诸多C语言案例讲解,有效下载期为10.5-10.10关闭)

    卷 backup 的文件夹 PATH 列表卷序列号为 00000025 D4A8:14B0J:.│  1.txt│  c语言经典案例效果图示.doc│  ├─1传智播客_尹成_C语言从菜鸟到高手_第一 ...

  10. 传智播客C语言视频第一季(有效下载期为10.1-10.7,10.8关闭)

     J:\传智播客_尹成_C语言从菜鸟到高手├─传智播客_尹成_C语言从菜鸟到高手_第一章C语言概述A│      第一讲1.1C语言第一阶段.mp4│      第二讲1.2c语言入门教程.mp4 ...

随机推荐

  1. 【Java】各种代码块的执行顺序

    静态代码块:用staitc声明,jvm加载类时执行,仅执行一次 构造代码块:类中直接用{}定义,每一次创建对象时执行. 执行顺序优先级:静态块,main(),构造块,构造方法. 构造函数 public ...

  2. unigui的部署【9】

    1.UniGUIServerModule的事件: procedure TUniServerModule.UniGUIServerModuleBeforeInit(Sender: TObject);be ...

  3. nodejs文本文件的读写

    文本文件的换行符 方法一: var EOL = fileContents.indexOf("\r\n") >= 0 ? "\r\n" : "\n ...

  4. shell子字符串截取

    http://c.biancheng.net/view/1120.html Shell 截取字符串通常有两种方式:从指定位置开始截取和从指定字符(子字符串)开始截取. 从指定位置开始截取 这种方式需要 ...

  5. 【Linux】基于Exynos4412的U-Boot引导程序移植

    [Linux]基于Exynos4412的U-Boot引导程序移植 零.准备 首先我们得去下载好U-Boot的源码,因为用的芯片是2012年出的Exynos4412,因此我们选择这个时间节点附近的U-B ...

  6. python-pandas提取网页内tables(表格类型)数据

    比如,下面网页里大学排行的数据 分析这个页面,表格内的数据是包裹在tables里的 这样就可以使用pandas对数据进行提取并且导出成csv文件,具体代码很简单 import pandas as pd ...

  7. Electron35-DeepSeek桌面端AI系统|vue3.5+electron+arco客户端ai模板

    2025跨平台ai实战electron35+vite6+arco仿DeepSeek/豆包ai流式打字聊天助手. electron-deepseek-chat:实战ai大模型对话,基于vue3.5+el ...

  8. jmeter之多并发

    1.做压力测试时需要设置线程数,2.造数据时跑多接口多条数据需要设置线程数,并且保证每个线程的多接口顺序执行.3.需要设置数据不重复或者自增 一.设置线程数 主要用于压力测试需要多并发时设置线程数,以 ...

  9. PHP中的精确计算bcadd,bcsub,bcmul,bcdiv 及 扩展安装

    <?php/** * 精确加法 * @param [type] $a [description] * @param [type] $b [description] */function math ...

  10. 【work记录:c++web聊天服务器】解决了聊天窗口的问题|修复了"没有区分好友或者群聊的聊天窗口"的bug|修复了"群聊消息undefined"的bug

    日期:2025.4.24 学习内容: 解决了聊天窗口的问题 修复了"没有区分好友或者群聊的聊天窗口"的bug 修复了"群聊消息undefined"的bug 个人 ...