第四届传智杯 小卡与质数(java实现)
原题链接
题目背景
小卡迷上了质数!
题目描述
小卡最近迷上了质数,所以他想把任何一个数都转化为质数!
小卡有 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实现)相关推荐
- (附AK代码)第四届“传智杯”全国大学生IT技能大赛(决赛B组)题解
未完全完成,很快会更新. 第四届"传智杯"大赛(决赛B组)题解目录 A:小智的疑惑 1.题目概述 2.解析 3.AC代码 B:三元组 1.题目概述 2.解析 3.AC代码 C:排排 ...
- 第四届“传智杯”全国大学生IT技能大赛-Java B组题解
A组原成绩 A-组原成绩 题目描述 花栗鼠科技大学(Hualishu University of Science and Technology, HUST)的计算机组成原理快要出分了.你现在需要计算你 ...
- 第四届“传智杯”初赛B组题解
文章目录 前言 A.组成成绩 题目描述 输入格式 输出格式 输入输出样例 输入 #1 B.报告赋分 题目描述 输入格式 输出格式 输入输出样例 C.竞争得分 题目描述 输入格式 输出格式 输入输出样例 ...
- 2021年第四届“传智杯“大学B组
A.组原成绩 花栗鼠科技大学(Hualishu University of Science and Technology, HUST)的计算机组成原理快要出分了.你现在需要计算你的组原成绩如何构成. ...
- 第四届传智杯(初赛B组) | python题解思路
目录 A 组原成绩 B 报告赋分 C 竞争得分 D 小卡与质数2 E 萝卜数据库 总的来说,比练习赛还简单..... python运行时间排名不占优势 A 组原成绩 题解: t,h,e = map(i ...
- 第四届传智杯 | 练习赛 | python解法思路
题目列表 导语 A [#4练习赛]符合条件的数 B [#4练习赛]选代表 C [#4练习赛]成绩统计 D [#4练习赛]背答案 E [#4练习赛]击鼓传花 导语 前几天传智杯出了练习赛,博主考研空闲之 ...
- 第四届传智杯全国大学生IT技能大赛 初赛B组题解 -- D题
题目:小卡与质数2 Description 小卡最近迷上了质数,所以他想把任何一个数都转化为质数! 小卡有 T 次询问,每次给你一个数字 x,问有多少个比 x 小的非负整数 y,使得 x⊕y 是质数, ...
- 第四届“传智杯”全国大学生IT技能大赛(初赛B组)
复习专业课直接把这茬忘记了,补回去. 一开始做了A组的题目,我说怎么总感觉怪怪的. ~~~~~~~~~~ T216906 组原成绩 #include<iostream> #include& ...
- 第四届“传智杯”全国大学生IT技能大赛(初赛B组)题解
基本上都是模拟,除了第四题都很简单 1.T216906 组原成绩 代码 #include<iostream> using namespace std; int main() {int x, ...
- 第四届传智杯练习赛题解(c++)
共五个题,难度一般. 符合条件的数 题目描述: 给出 N 和 k,找到一个不小于 N的正整数,满足这个数中有 k位数字是 3,且尽可能小. 输入格式: 一行,两个整数 N(1 < =N<= ...
最新文章
- 用netty实现zcool_《Netty官方指南》把Netty当做一个通用的库
- Camera 涉及的文件70
- 从一段代码的汇编看计算机的工作原理
- php 设置断点,PHP xdebug安装配置(支持断点调试)
- PMM (Percona MySQL Monitor) 部署
- 【转】jmeter学习笔记——JDBC测试计划-连接Mysql
- BRAND-NEW OF DOUBLES工作组合的新作品
- 声速的测量的实验原理和应用_创想智控:光学三角测量系统的测量原理与应用...
- C语言:简单实现图书管理系统
- pyqt 鼠标离开按钮_小米 Smart Pad 体验:表面它是个鼠标垫,其实还是个鼠标垫...
- 迅雷有linux版本吗,迅雷 - Linux Wiki
- 【软路由】旁路由使用配置教程
- golang: grpc: received message larger than max
- DIV+CSS样式---网易盖楼
- 邝子平:vc兼做pe?
- jump label
- [图形学] 延迟贴花渲染技术 (A Deffered Decal Rendering Technique)
- 做食材配送行业,哪个平台软件比较好?
- php入门写法PHP入门基础之php代码写法
- 两个ip是否在同一网段?
热门文章
- 计算机更新好不,Win10自动更新好不好有必要吗?如何关闭屏蔽Windows更新?
- 复杂 Excel 表格导入导出的最简方法
- CDN与智能DNS原理和应用 - 学习/实践
- 负载均衡(四层) LVS(看完就能去上班)
- “情商”和“智商”究竟有哪些区别?
- python自动化操作网页(谷歌浏览器)
- ,智商达到140及以上可以称之为天才
- c#学习笔记之八 函数的代表delegate的用法:c# 求 三角函数 指数函数 积分
- 蜀门锻造费用统计(武器/坐骑锻造)
- 从代码和底层探究Synchronized锁实现