2020级cpp机考模拟题A卷-#题解2
这部分的题目都有一定难度,有兴趣的同学可以钻研一下。
特此感谢来自BDT20030 tql的支持。
2:素数的和-2
题意:
计算不大于m的素数之和。(多么容易理解的题目啊,对吧)
题解(有点复杂的算法实现):
这题的难度就在于如何在不超时的情况下完成计算。(ps:内存上没卡你,不然更痛苦)
请直接看代码,注释打了真的很久,把30号的超纲代码改得不超纲还能绿也用了好久。
上板子(埃氏筛,稍易):
#include<iostream>
#include<cmath>
#include<string>
#include<cstring>
#include<stdlib.h>
using namespace std;
const int M = 10000005, mod = 100000007;//因为m的最大值是10000000,定义一个常量稍大于m就可以了
bool b[M];//都定义为全局变量,可以在主函数里调用
int p[M], cnt = 0;//p用于存储m以内的全部素数,cnt为个数
void k()
{
for (int i = 2; i <= M; i++)//1不是素数,所以b[1]=0.
{
b[i] = 1;//先当他们全是素数,下面再用循环判断
}
for (int i = 2; i < sqrt(M); i++)//判断M以内的各个数字是否为素数
{
if (b[i])
{
cnt++;//用于记录p中有几个数据
p[cnt] = i;//p[ ]用于存储各个<=M的素数
for (int j = i*i; j < M; j+=i)//一定要判断j<=m,保证数组不会爆
{
b[j] = 0;//i 存储的是素数,j 为某素数的倍数,这个数一定不是素数
}
}
}
}
int main()
{
k();//因为前面是全局变量所以使用函数后面能够调用
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
int m;
long long int sum = 0;
cin >> m;
for (int i = 1; i <= cnt; i++)
{
if (p[i] <= m)
sum = (sum + p[i]) % mod;//素数累加就好了,大家都会
}
cout << sum << endl;
}
return 0;
}
上板子(线性筛,较难):
#include<iostream>
#include<cmath>
using namespace std;
const int M = 10000005, mod = 100000007;//因为m的最大值是10000000,定义一个常量稍大于m就可以了
bool b[M];//都定义为全局变量,可以在主函数里调用
int p[M], cnt = 0;//p用于存储m以内的全部素数,cnt为个数
void k()
{
for (int i = 2;i <= M;i++)//1不是素数,所以b[1]=0.
{
b[i] = 1;//先当他们全是素数,下面再用循环判断
}
for (int i = 2;i <= M;i++)//判断M以内的各个数字是否为素数
{
if (b[i])//b[ ]用于判断各个数字是否为素数,是则=1,不是=0
{
cnt++;//用于记录p中有几个数据
p[cnt] = i;//p[ ]用于存储各个<=M的素数
}
for (int j = 1;j <= cnt && i * p[j] <= M;j++)//一定要判断i*p[j]<=m,保证数组不会爆
{
b[i * p[j]] = 0;//p[j]存储的是素数,i*p[j]为某素数的倍数,这个数一定不是素数(这是为了减少循环次数,缩短时间)
if (i % p[j] == 0)break;//假如i是某个素数的倍数,就不用进行循环了(这也是为了缩短时间)
}
}
}
int main()
{
k();//因为前面是全局变量所以使用函数后面能够调用
int n;
cin >> n;
for(int i=1;i<=n;i++)
{
int m;
long long int sum = 0;
cin >> m;
for (int i = 1;i <= cnt;i++)
{
if(p[i]<=m)
sum = (sum + p[i]) % mod;//素数累加就好了,大家都会
}
cout << sum << endl;
}
return 0;
}
5:不喜欢的数字
题意:
计算1到m中不属于p1/p2/p3倍数的数的个数并输出。
难度1:内存只给了 2048 KB;难度2:时间卡在了1s;难度3:m的范围达到了e9(仍在int范围内)。
所以不要尝试去开数组了!(我真是个傻子,看到e9还尝试用bool型开数组)
题解:
首先,复习一下辗转相除法求最大公因数:
int gcd(int a, int b)//求a、b的最大公因数
{
if (a < b)
swap(a, b);
int c;
while (a % b != 0)
{
c = a % b;
a = b;
b = c;
}
return b;
}
假设范围是1-m,给出p1,要求该范围内p1倍数的个数,则有number=m/p1。所以要找出1-m范围内p1、p2、p3的倍数个数,只要先算出p1、p2、p3在该范围内的倍数的个数(然后再相加就行了,才怪),然后要算出重复的数字(即公倍数)的个数,减去他们被重复计算的次数,这样才能得到正确的个数。
对于e9,其实用long int会好一点,毕竟e9的话距离int极限也差不多了,加个long的话可以不去担心他在四则运算中随随便便就炸了//当然有时候你用了long long也还是会炸。
上板子:
int gcd(int a, int b)//求a、b的最大公因数
{
if (a < b)
swap(a, b);
int c;
while (a % b != 0)
{
c = a % b;
a = b;
b = c;
}
return b;
}
int lcm(int a, int b)//求两个数的最小公倍数
{
return a * b / gcd(a, b);
}
int lcm(int a, int b,int c)//求三个数的最小公倍数
{
return lcm(lcm(a,b),c);
}
int main()
{
int n;
cin >> n;
while (n--)
{
int m, p1, p2, p3,a;
cin >> m >> p1 >> p2 >> p3;
int a1 = m / p1, a2 = m / p2, a3 = m / p3;// a1/a2/a3的倍数的个数
int a12 = m / lcm(p1, p2), a23 = m / lcm(p2, p3), a13 = m / lcm(p1, p3);// a1、a2、a3两两数的最小公倍数的倍数的个数
int a123 = m / lcm(p1, p2, p3);//a1、a2、a3最小公倍数的个数
a = a1 + a2 + a3 - a12 - a13 - a23 + a123;//通过加减删去重复计算的数,得到p、p2、p3的倍数的个数
if (p1 == 1 || p2 == 1 || p3 == 1)a = m;
cout <<m - a << endl;
}
return 0;
}
正在更新中......
制作:BDT20040
2020级cpp机考模拟题A卷-#题解2的更多相关文章
- 2020级cpp机考模拟题A卷-#题解1
为了各位朋友的身心健康(不是),我们按照题目难度顺序来写题解. 第一次写题解,希望多点包容和鼓励(恬不知耻 1:谁先输出-4 题意: 输入3个整数,按从大到小的顺序输出,每两个数字间加一个空格. 题解 ...
- 2020级C++实验课-期末机考模拟考题解
做这个题解的理由很简单,有很多同学想写但是不会写,凑巧我写了,所以搞个题解. 顺序就是题单里的顺序(界面左上角菜单切换文章,右上角目录方便查看) 1:黑马白马 题意: 随机得到一个数字,如果是偶数,则 ...
- 2020级cpp上机考试题解#B卷
A卷的第七题我只会一个个排除的方法 意思就是暂时没有好办法所以A卷不搞了 1:递归函数求数列 题意: 有一个递归函数int f(int m),计算结果代表了数列的第m项.当m等于1时,函数结果返回1: ...
- 【2-SAT】【并查集】NOIp模拟题 植树方案 题解
一个类似2-SAT的思想,但是简化了很多.只需要用到并查集实现. 题目描述 企鹅国打算种一批树.所谓树,就是由$N$个结点与$N-1$条边连接而成的连通无向图.企鹅国的国王对于这些树有下列要求 ...
- BUPT 2012复试机考 4T
题目描述 我们都学习过计算机网络,知道网络层IP协议数据包的头部格式如下: 其中IHL表示IP头的长度,单位是4字节:总长表示整个数据包的长度,单位是1字节.传输层的TCP协议数据段的头部格式如下: ...
- PMP全真模拟题真题試題含答案解析 2019年下半年PMP考試适用 PMP中文文对照试题 【香港台灣地區PMP考試也可用】
PMP全真模拟题真题试题 含答案解析 2019年下半年PMP考试适用 PMP中文文对照试题 [香港台灣地區PMP考試也可用]PMP全真模擬題真題試題 含答案解析 2019年下半年PMP考試适用 PMP ...
- 更新 | 2019年9月计算机二级office模拟题库
随着2019年上半年计算机二级考试的完美落幕,紧接着的便是9月份的考试了. 到目前为止,下半年9月份计算机二级考试报名开通时间在6月前后,现在也基本结束. 2019年9月(56次)全国计算机等级考试( ...
- 1+X Web前端开发(初级)理论考试样题(附答案)
传送门 教育部:职业教育将启动"1+X"证书制度改革 职业教育改革1+X证书制度试点启动 1+X成绩/证书查询入口 一.单选题(每题 2 分,共 60 分) 1.在 HTML 中, ...
- 全国信息学奥林匹克联赛 ( NOIP2014) 复赛 模拟题 Day1 长乐一中
题目名称 正确答案 序列问题 长途旅行 英文名称 answer sequence travel 输入文件名 answer.in sequence.in travel.in 输出文件名 answer. ...
随机推荐
- [源码解析] TensorFlow 分布式环境(7) --- Worker 动态逻辑
[源码解析] TensorFlow 分布式环境(7) --- Worker 动态逻辑 目录 [源码解析] TensorFlow 分布式环境(7) --- Worker 动态逻辑 1. 概述 1.1 温 ...
- 简单才是美! SpringBoot+JPA
SpringBoot 急速构建项目,真的是用了才知道,搭配JPA作为持久层,一简到底!下面记录项目的搭建,后续会添加NOSQL redis,搜索引擎elasticSearch,等等,什么不过时就加什么 ...
- java中接口interface和private私有内部类怎样一块配合着用?
3.接口interface和private内部类协同工作[新手可忽略不影响继续学习]马克-to-win:由于是private内部类,外面无法访问甚至无法看到你编的源代码(如果在不同的包中),非常安全. ...
- Java中的反射原理以及简单运用(原理+例子)
@ 目录 学习总结 1. 为什么要使用反射 2. 反射的概念 3. Java反射加载过程 4. 反射优缺点 5. 字节码对象理解 6. 获取字节码对象(.class)的三种方式 7. 反射常用API ...
- EMS创建独立新用户并分配邮箱
创建新用户"王春海"并分配邮箱. 以Exchange管理员身份登录EMS控制台.在PowerShell命令行提示符下,键入如下命令: [PS] C:\Windows\system3 ...
- 2021年iOS 开发者账号申请-最新
前言 现在已经是2021年了,中国国内的互联网生态国家管控越来越严禁,国家反垄断法,未成年人游戏限制,整治娱乐圈不良文化,出台公民网络个人信息保护法,全网进行app 应用进行安全审查,等等等,无不意味 ...
- 小程序监听-data 或者 子组件properties 数据
observers: { 'plateInfo': (obj) => { console.log('监听', obj) if(Object.keys(obj) ...
- 一行代码的魅力 -- css
<template> <div></div> </template> <script> export default { } </sc ...
- QQ浏览器X5内核问题汇总 转
常常被人问及微信中使用的X5内核的问题,其实我也不是很清楚,只知道它是基于android 4.2的webkit,版本号是webkit 534.今天正好从X5团队拿到了一份问题汇总,梳理下发出来,给各位 ...
- Postman 正确使用姿势
前言: 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 简介: Postman是一个接口测试工具,在做接口测试的时候,Postman相当于一个客户端,它可以模拟用户发起的各类HTTP请求,将 ...