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. ...
随机推荐
- 创建axios拦截器
上一篇说axios并发的时候有提到 axios的请求统一管理是为了创建拦截器 具体说一下拦截器的创建 import Vue from 'vue'; import axios from 'axios'; ...
- 自定义View的onDraw 函数不执行
解决办法: 在自定义的View 的构造方法中添加一句话: this.setWillNotDraw(false);解释:那么加这条语句的作用是什么?先看API: If this ...
- 数据库查询中where和having的用法
1.类型: "baiWhere"是一个约束声明,在查询数据库du的结果返回之前对数据库中zhi的查询条件进行约束dao,即在结果返回之前起作用,且where后面不能使用" ...
- MyEclipse如何刷新项目
第一种:选中项目,点右键Refresh即可, 第二种:选择project->clean,选中所要编译得项目,点ok即可
- Java Web项目与Java项目的区别
一.以下是我对Java Web项目和Java项目这两者的理解以及区别: 1.Java Web项目是基于Java EE类的:而Java项目是基于Java应用程序的. 2.Java Web项目是网页的编码 ...
- 解决vue安装时出现vue --version或vue不是内部命令的问题
1. 试图全局配置 vue 的环境变量,找到 vue.cmd 的路径,然后进行配置. 问题:在文件搜索中,没有找到 vue.cmd,失败. 1.npm i npm -g 全局 update 了 npm ...
- 【深度学习 论文篇 01-1 】AlexNet论文翻译
前言:本文是我对照原论文逐字逐句翻译而来,英文水平有限,不影响阅读即可.翻译论文的确能很大程度加深我们对文章的理解,但太过耗时,不建议采用.我翻译的另一个目的就是想重拾英文,所以就硬着头皮啃了.本文只 ...
- Python学习报告及后续学习计划
第一次有学习Python的想法是源于寒假在家的时候,高中同学问我是否学了Python(用于深度学习),当时就到b站收藏了黑马最新的教学视频,但是"收藏过等于我看了",后续就是过完年 ...
- TexFormula2Word: 将Latex公式转换为MathML的Chrome扩展
前言 因为学校要求对毕业论文进行格式检查,而格式检查又必须上传Word文件,这就导致只能使用Word写毕业论文.但Word公式输入实在是太难用,加之我在小论文中已经用Latex写过大部分公式,所以就希 ...
- go语言编译过程概述
go语言编译过程概述 总结自<go语言设计与实现> 名词解释: 中间代码 中间代码是编译器或者虚拟机使用的语言,它可以来帮助我们分析计算机程序.在编译过程中,编译器会在将源代码转换到机器码 ...