原题链接

题目背景

小卡迷上了质数!

题目描述

小卡最近迷上了质数,所以他想把任何一个数都转化为质数!

小卡有 T次询问,每次给你一个数字 x,问有多少个比 x 小的非负整数 y,使得 x⊕y 是质数,其中 ⊕ 表示按位异或。

输入格式

第一行一个正整数 ,表示有 T组询问。

接下来 T行,每行一个正整数

输出格式

对于每组询问,输出一行一个整数,表示答案。

输入输出样例

输入

9
5
6
7
8
9
10
100
1000
10000

输出

2
4
4
2
2
4
22
163
1132

时间限制:1s,空间限制:128MB

解析:

跟着我的思路来,你一定会搞清楚这题的。

我们用暴力解的话,一共T次询问,每次要枚举y(x-1)个数,所以时间复杂度为O(Ty)。显然是超时的。这道题主要考察的是对于异或的理解与运用。

1.题目要求x^y=k,这个k必须是个质数。对于异或运算,我们得明白一个原理:x^y=k<==>x^k=y,这个你自己模拟两个数推一下就能理解,如果不明白请弄明白再看下去。这样我们就可以转换问题为,x异或上哪些质数k,使得结果y比x小。

2.我们先不强求k为一个质数,先来研究一下x异或上哪些非负数使得结果y比x小。举个例子,的二进制数为,它的二进制数有7位。如果我们将异或上一个数位比7位多的二进制数,其结果肯定是八位二进制数,肯定比大。所以两个二进制数异或后的结果的数位,取决于较大的那个数的数位。对于来说,我们首先肯定要用数位等于小于它的二进制数异或,其结果才能小于。我们通过下面例子分析,1011010⊕(1000000~1111111)间的数都会比1011010小,为什么呢?不管后面的数怎么异或,我们把最高位的1通过异或变成了0,所以不管后面怎样,其结果肯定小于90,而(1000000~1111111)就是

如图上图所示,对于 来说,我们把它第二个1异或为0,前提是前面的数都为0,这让第7、6位的10保持不变,而通过第二个1变成0来使得变小。这里我解释得不好,总之大家一定要按自己的方式理解这点。所以我们只要找出所有1的位置,就可以确定对应区间:,,,只有异或这些区间,我们才能使得结果y小于x。

3.现在我们可以找到哪些区间异或x其结果小于x。然后我们只要知道这些区间中有多少个质数就能得出答案。对于区间中筛选质数,我这里用的是欧拉筛,如果不会欧拉筛自行百度了解其原理。

现在我来说明一些代码实现的细节。真正实现时我们是先要筛选出质数,再进行其他操作。那我们的筛选范围如何确定呢?通过上面分析,要和x异或后的结果小于x,那这个数肯定要数位小于等于x,题目说x最大为100万,100万的二进制数位为20位,所以我这里就取最大可能值二进制为20个1的1048575。我们获取到每个具体x后,其实要找各个区间中的质数个数,也就是这种区间。而这个区间仔细想想,它就代表二进制数位有3位的所有数。那怎样的数才能数位有3位?显然它的最高位1在第3位就能满足这个条件。所以我们筛选完质数后,可以再开个数组cnt,cnt[i]就表示二进制数位为i的数中有多少个质数。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;public class Main {//因为x最大值10⁶的二进制数位为20,所以能和它异或的最大数就是20个1static final int N = 1048576;public static void main(String[] args) throws IOException { InputReader in = new InputReader();//t:询问次数,x:每次询问的具体数字,ans:输出的答案,m:质数个数int t = in.nextInt(), x, ans, m;boolean[] nums = new boolean[N];//表示1~1048576int[] primes = new int[N];//用来装质数m = sievePrime(nums, primes);//这种解法就只需要筛一次int[] cnt = new int[21];//用来装每个区间中的质数个数,每次询问只需要来这里查//看看每个质数二进制数位是多少for (int i = 1; i <= m; i++) for (int j = 20; j >= 1; j--) //1 << 6:1000000//假设primes[i] &上1000000不等于0的话,就说明它最高位为6//从20开始遍历可以保证最先不为0的就是最高位if ((primes[i] & (1 << (j - 1))) != 0) {cnt[j]++;break;//找到最高位就跳出}while (t-- > 0) {//t次询问x = in.nextInt();ans = 0;for (int i = 20; i >= 1; i--) //找出x二进制中每个1的所在数位if ((x & (1 << (i - 1))) != 0) ans += cnt[i];System.out.println(ans);}}//欧拉筛,返回bb范围下的质数个数public static int sievePrime(boolean[] bb, int[] prime) {int c = 0;for (int i = 2; i < bb.length; i++) {if (!bb[i]) prime[++c] = i;for (int j = 1; j <= c && i * prime[j] < bb.length; j++) {bb[i * prime[j]] = true;if (i % prime[j] == 0) break;    }}return c;}}class InputReader{BufferedReader buf;StringTokenizer tok;public InputReader() {buf = new BufferedReader(new InputStreamReader(System.in));}boolean hasNext() {while (tok == null || !tok.hasMoreElements()) {try {tok = new StringTokenizer(buf.readLine());} catch (IOException e) {return false;}}return true;}String next() {if (hasNext()) {return tok.nextToken();}return null;}int nextInt() {return Integer.parseInt(next());}long nextLong() {return Long.parseLong(next());}String nextLine() throws IOException {return buf.readLine();}
}

第四届传智杯 小卡与质数(java实现)相关推荐

  1. (附AK代码)第四届“传智杯”全国大学生IT技能大赛(决赛B组)题解

    未完全完成,很快会更新. 第四届"传智杯"大赛(决赛B组)题解目录 A:小智的疑惑 1.题目概述 2.解析 3.AC代码 B:三元组 1.题目概述 2.解析 3.AC代码 C:排排 ...

  2. 第四届“传智杯”全国大学生IT技能大赛-Java B组题解

    A组原成绩 A-组原成绩 题目描述 花栗鼠科技大学(Hualishu University of Science and Technology, HUST)的计算机组成原理快要出分了.你现在需要计算你 ...

  3. 第四届“传智杯”初赛B组题解

    文章目录 前言 A.组成成绩 题目描述 输入格式 输出格式 输入输出样例 输入 #1 B.报告赋分 题目描述 输入格式 输出格式 输入输出样例 C.竞争得分 题目描述 输入格式 输出格式 输入输出样例 ...

  4. 2021年第四届“传智杯“大学B组

    A.组原成绩 花栗鼠科技大学(Hualishu University of Science and Technology, HUST)的计算机组成原理快要出分了.你现在需要计算你的组原成绩如何构成. ...

  5. 第四届传智杯(初赛B组) | python题解思路

    目录 A 组原成绩 B 报告赋分 C 竞争得分 D 小卡与质数2 E 萝卜数据库 总的来说,比练习赛还简单..... python运行时间排名不占优势 A 组原成绩 题解: t,h,e = map(i ...

  6. 第四届传智杯 | 练习赛 | python解法思路

    题目列表 导语 A [#4练习赛]符合条件的数 B [#4练习赛]选代表 C [#4练习赛]成绩统计 D [#4练习赛]背答案 E [#4练习赛]击鼓传花 导语 前几天传智杯出了练习赛,博主考研空闲之 ...

  7. 第四届传智杯全国大学生IT技能大赛 初赛B组题解 -- D题

    题目:小卡与质数2 Description 小卡最近迷上了质数,所以他想把任何一个数都转化为质数! 小卡有 T 次询问,每次给你一个数字 x,问有多少个比 x 小的非负整数 y,使得 x⊕y 是质数, ...

  8. 第四届“传智杯”全国大学生IT技能大赛(初赛B组)

    复习专业课直接把这茬忘记了,补回去. 一开始做了A组的题目,我说怎么总感觉怪怪的. ~~~~~~~~~~ T216906 组原成绩 #include<iostream> #include& ...

  9. 第四届“传智杯”全国大学生IT技能大赛(初赛B组)题解

    基本上都是模拟,除了第四题都很简单 1.T216906 组原成绩 代码 #include<iostream> using namespace std; int main() {int x, ...

  10. 第四届传智杯练习赛题解(c++)

    共五个题,难度一般. 符合条件的数 题目描述: 给出 N 和 k,找到一个不小于 N的正整数,满足这个数中有 k位数字是 3,且尽可能小. 输入格式: 一行,两个整数 N(1 < =N<= ...

最新文章

  1. 用netty实现zcool_《Netty官方指南》把Netty当做一个通用的库
  2. Camera 涉及的文件70
  3. 从一段代码的汇编看计算机的工作原理
  4. php 设置断点,PHP xdebug安装配置(支持断点调试)
  5. PMM (Percona MySQL Monitor) 部署
  6. 【转】jmeter学习笔记——JDBC测试计划-连接Mysql
  7. BRAND-NEW OF DOUBLES工作组合的新作品
  8. 声速的测量的实验原理和应用_创想智控:光学三角测量系统的测量原理与应用...
  9. C语言:简单实现图书管理系统
  10. pyqt 鼠标离开按钮_小米 Smart Pad 体验:表面它是个鼠标垫,其实还是个鼠标垫...
  11. 迅雷有linux版本吗,迅雷 - Linux Wiki
  12. 【软路由】旁路由使用配置教程
  13. golang: grpc: received message larger than max
  14. DIV+CSS样式---网易盖楼
  15. 邝子平:vc兼做pe?
  16. jump label
  17. [图形学] 延迟贴花渲染技术 (A Deffered Decal Rendering Technique)
  18. 做食材配送行业,哪个平台软件比较好?
  19. php入门写法PHP入门基础之php代码写法
  20. 两个ip是否在同一网段?

热门文章

  1. 计算机更新好不,Win10自动更新好不好有必要吗?如何关闭屏蔽Windows更新?
  2. 复杂 Excel 表格导入导出的最简方法
  3. CDN与智能DNS原理和应用 - 学习/实践
  4. 负载均衡(四层) LVS(看完就能去上班)
  5. “情商”和“智商”究竟有哪些区别?
  6. python自动化操作网页(谷歌浏览器)
  7. ,智商达到140及以上可以称之为天才
  8. c#学习笔记之八 函数的代表delegate的用法:c# 求 三角函数 指数函数 积分
  9. 蜀门锻造费用统计(武器/坐骑锻造)
  10. 从代码和底层探究Synchronized锁实现