P8842 [传智杯 #4 初赛] 小卡与质数2
变态数学题(主考位运算与素数筛)。
读完题看起来有点难做,因为质数的出现是根本没有可以使用的规律。暴力的话也很好想,枚举 $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的更多相关文章
- P8844 [传智杯 #4 初赛] 小卡与落叶
简要题意 给出一个 \(n\) 个节点的以 \(1\) 为根的树,每一个节点 \(i\) 带权 \(w_i\),初始时所有节点的权均为 \(0\).有 \(m\) 个操作,支持以下操作: 1 x,对于 ...
- P8872 [传智杯 #5 初赛] D-莲子的物理热力学
题目链接:P8872 [传智杯 #5 初赛] D-莲子的物理热力学 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 参考了题解,自己在这再写一遍 假设数组有序且经过m次操作后的数组最 ...
- 第三届“传智杯”全国大学生IT技能大赛(初赛A组)题解
留念 C - 志愿者 排序..按照题目规则说的排就可以.wa了两发我太菜了qwq #include<bits/stdc++.h> using namespace std; const in ...
- 第四届“传智杯”全国大学生IT技能大赛题解
目录 A B C D E F G 今年题目难度普遍偏低.只有 D,F 还好. A 按题目给的公式计算即可.注意应在最后的答案中去掉小数部分. B 按照题意模拟即可.注意答案要与 \(0\) 取 \(\ ...
- P8201 [传智杯 #4 决赛] [yLOI2021] 生活在树上(hard version)
个人思路: 首先,题目可以转化为是否存在 \(a,b\) 路径上一点 \(u\),满足 \(w_u = dis{1,a} \oplus dis{1,b} \oplus w_{lca(a,b)} \op ...
- 传智播客DotNet面试题
技术类面试.笔试题汇总(整理者:杨中科,部分内容从互联网中整理而来) 注:标明*的问题属于选择性掌握的内容,能掌握更好,没掌握也没关系. 下面的参考解答只是帮助大家理解,不用背,面试题.笔试题千变万化 ...
- Socket小项目的一些心得(鸣谢传智的教学视频)
Socket是一种封装了四层通信的整体抽象入口,通常也称作"套接字",这是常用的四层通信这是访问Socket的流程图,这个分为客户端和服务器端,其中服务器端有以下步骤去建立,前面的 ...
- 传智博客(JavaWeb方面的所有知识)听课记录(经典)
一. JavaWeb基础 第一天: 1.Eclipse详解: (1).Bad versionnumber in .class file:编译器版本和运行(JRE)版本不符合.高的JRE版本 ...
- 传智播客C语言视频第二季(第一季基础上增加诸多C语言案例讲解,有效下载期为10.5-10.10关闭)
卷 backup 的文件夹 PATH 列表卷序列号为 00000025 D4A8:14B0J:.│ 1.txt│ c语言经典案例效果图示.doc│ ├─1传智播客_尹成_C语言从菜鸟到高手_第一 ...
- 传智播客C语言视频第一季(有效下载期为10.1-10.7,10.8关闭)
J:\传智播客_尹成_C语言从菜鸟到高手├─传智播客_尹成_C语言从菜鸟到高手_第一章C语言概述A│ 第一讲1.1C语言第一阶段.mp4│ 第二讲1.2c语言入门教程.mp4 ...
随机推荐
- dockerfile 由于公钥不可用,无法验证以下签名
报错 当我在打包 docker镜像时,发生了报错 $ sudo docker build -t dcgm-exporter:3.2.5 . 1.772 The following signatures ...
- mysql order by 中文排序
前言 在 MySQL 中,我们经常会对一个字段进行排序查询,但进行中文排序和查找的时候,对汉字的排序和查找结果往往都是错误的. 这种情况在 MySQL 的很多版本中都存在. 如果这个问题不解决,那么 ...
- linux ssh 免密登录
1.服务器端开启密钥登录模式 $ vim /etc/ssh/sshd_config # 是否允许 root 远程登录 PermitRootLogin yes # 密码登录是否打开 PasswordAu ...
- Cannot find config.m4. phpize 安装扩展出错
原因 编译扩展包下面的名字可能不是 config.m4,也有可能有类似 config0.m4 的文件:因此名字不一样也是找不到的,我们需要用 mv config0.m4 config.m4 :修改文件 ...
- [每日算法 - 华为机试] LeetCode1160. 拼写单词
题目入口 力扣https://leetcode.cn/problems/find-words-that-can-be-formed-by-characters/ 题目概述 给你一份『词汇表』(字符串数 ...
- 【Linux】5.3 Shell字符串
Shell 字符串 字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号.单双引号的区别跟PHP类似. 1. 单 ...
- 【JVM之内存与垃圾回收篇】垃圾回收相关算法
垃圾回收相关算法 标记阶段:引用计数算法 在堆里存放着几乎所有的 Java 对象实例,在 GC 执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象.只有被标记为己经死亡的对象, ...
- 【Win32】通过多线程自动关闭对话框的方法
零.需求 希望在Windows开机后自动弹出个对话框提示一下,过8秒后自动关闭 一.解决 1.建项目和源文件 在VC6.0中新建Win32项目 新建C++源文件 2.编写代码 基础结构 #includ ...
- 什么是 Java 的 PLAB(Promotion Local Allocation Buffer)?
什么是 Java 的 PLAB(Promotion Local Allocation Buffer)? PLAB 全称是 Promotion Local Allocation Buffer,是 Jav ...
- PHP获取下个月今天时间
获取php下个月当前时间public static function fq_time($time = ""){ if (!$time) $time = time(); $arr = ...