这部分的题目都有一定难度,有兴趣的同学可以钻研一下。

特此感谢来自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的更多相关文章

  1. 2020级cpp机考模拟题A卷-#题解1

    为了各位朋友的身心健康(不是),我们按照题目难度顺序来写题解. 第一次写题解,希望多点包容和鼓励(恬不知耻 1:谁先输出-4 题意: 输入3个整数,按从大到小的顺序输出,每两个数字间加一个空格. 题解 ...

  2. 2020级C++实验课-期末机考模拟考题解

    做这个题解的理由很简单,有很多同学想写但是不会写,凑巧我写了,所以搞个题解. 顺序就是题单里的顺序(界面左上角菜单切换文章,右上角目录方便查看) 1:黑马白马 题意: 随机得到一个数字,如果是偶数,则 ...

  3. 2020级cpp上机考试题解#B卷

    A卷的第七题我只会一个个排除的方法 意思就是暂时没有好办法所以A卷不搞了 1:递归函数求数列 题意: 有一个递归函数int f(int m),计算结果代表了数列的第m项.当m等于1时,函数结果返回1: ...

  4. 【2-SAT】【并查集】NOIp模拟题 植树方案 题解

        一个类似2-SAT的思想,但是简化了很多.只需要用到并查集实现. 题目描述 企鹅国打算种一批树.所谓树,就是由$N$个结点与$N-1$条边连接而成的连通无向图.企鹅国的国王对于这些树有下列要求 ...

  5. BUPT 2012复试机考 4T

    题目描述 我们都学习过计算机网络,知道网络层IP协议数据包的头部格式如下: 其中IHL表示IP头的长度,单位是4字节:总长表示整个数据包的长度,单位是1字节.传输层的TCP协议数据段的头部格式如下:  ...

  6. PMP全真模拟题真题試題含答案解析 2019年下半年PMP考試适用 PMP中文文对照试题 【香港台灣地區PMP考試也可用】

    PMP全真模拟题真题试题 含答案解析 2019年下半年PMP考试适用 PMP中文文对照试题 [香港台灣地區PMP考試也可用]PMP全真模擬題真題試題 含答案解析 2019年下半年PMP考試适用 PMP ...

  7. 更新 | 2019年9月计算机二级office模拟题库

    随着2019年上半年计算机二级考试的完美落幕,紧接着的便是9月份的考试了. 到目前为止,下半年9月份计算机二级考试报名开通时间在6月前后,现在也基本结束. 2019年9月(56次)全国计算机等级考试( ...

  8. 1+X Web前端开发(初级)理论考试样题(附答案)

    传送门 教育部:职业教育将启动"1+X"证书制度改革 职业教育改革1+X证书制度试点启动 1+X成绩/证书查询入口 一.单选题(每题 2 分,共 60 分) 1.在 HTML 中, ...

  9. 全国信息学奥林匹克联赛 ( NOIP2014) 复赛 模拟题 Day1 长乐一中

    题目名称 正确答案  序列问题 长途旅行 英文名称 answer sequence travel 输入文件名 answer.in sequence.in travel.in 输出文件名 answer. ...

随机推荐

  1. ES6-11学习笔记--模块化

    模块化规范有: CommonJS:Node.js AMD:require.js CMD:sea.js ES6:Module     ES6模块化使用: 关键词:export.import.as.exp ...

  2. 用SimpleDateFormat求出哪天是星期几,如2008-11-11

    题目5: 巧妙利用SimpleDateFormat求出: 2008-11-11是星期几?import java.text.ParseException;import java.text.SimpleD ...

  3. Centos搭建 LAMP 服务器教程

    搭建 LAMP 服务 搭建 MySQL 数据库 安装 MySQL 使用 yum 安装 MySQL: yum install mysql-server -y 安装完成后,启动 MySQL 服务: ser ...

  4. 搭建 LNMP 环境

    搭建 LNMP 环境 搭建 Nginx 静态服务器 安装 Nginx 使用 yum 安装 Nginx: yum install nginx -y 修改 /etc/nginx/conf.d/defaul ...

  5. WebSocket学习笔记

    参考文章链接:http://www.ruanyifeng.com/blog/2017/05/websocket.html 简单示例:https://www.yiibai.com/websocket/p ...

  6. Spring-JdbcTemplate基本使用

    概述:它是spring提供的一个对象,是对原始繁琐的Jdbc API对象的简单封装,spring框架为我们提供了很多的操作模板类.例如操作关系型数据库JdbcTemplate和HibernateTem ...

  7. 使用JQGrid中可见列并存入Cookie

    引入js与css <link href="~/Content/js/jquery-ui/jquery-ui.min.css" rel="stylesheet&quo ...

  8. 数组-LeetCode-笔试

    目录 数组理论基础 二分查找 二分法第一种写法 二分法第二种写法 ACM 移除元素 暴力解法 双指针法(快慢指针) ACM 有序数组的平方 暴力排序 双指针法 长度最小的子数组 暴力解法 滑动窗口 相 ...

  9. 『现学现忘』Git基础 — 2、Git和SVN的区别

    1.Git和SVN的区别 (1)SVN(集中式版本管理系统) 集中式的版本控制系统都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者 ...

  10. Unity—2D边缘检测(描边效果)

    一.ShaderLab 1.Alpha值边缘检测 根据图片的Alpha值边缘判定,向内扩一段距离做边缘,颜色设置未描边颜色: 片元着色阶段,向上下左右四个方向做检测,有一个点的透明度为0,判定为边缘: ...