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. ...
随机推荐
- 5V转10.5V原理图
- 带你玩转prefetch, preload, dns-prefetch,defer和async
现代浏览器性能优化-JS篇 众所周知,JS的加载和执行会阻塞浏览器渲染,所以目前业界普遍推荐把script放到</body>之前,以解决js执行时找不到dom等问题.但随着现代浏览器的普及 ...
- 修改Menu_item的字体属性
前面一直在找 MenuItem的文字颜色的设置.我发现API中只有背景颜色的设置... 所以找到下面的方法.在OverFlow上看到的.在onCreateOptionsMenu中覆写一下, 使Menu ...
- JS 实现下拉框去重
JS 实现下拉框去重 学习内容: 需求 总结: 学习内容: 需求 用 JS 下拉框去重 实现代码 <html> <head> <meta http-equiv=" ...
- Django框架中settings.py注释
1 # coding:utf8 2 """ 3 Django settings for DjangoTest project. 4 5 Generated by 'dja ...
- Java线程内存模型-JVM-底层原理
public class Demo1 { private static boolean initFlag=false; public static void main(String[] args) t ...
- Solon 1.6.36 发布,更现代感的应用开发框架
相对于 Spring Boot 和 Spring Cloud 的项目 启动快 5 - 10 倍 qps 高 2- 3 倍 运行时内存节省 1/3 ~ 1/2 打包可以缩小到 1/2 ~ 1/10(比如 ...
- react实战系列 —— 起步(mockjs、第一个模块、docusaurus)
其他章节请看: react实战 系列 起步 本篇我们首先引入 mockjs ,然后进入 spug 系统,接着模仿"任务计划"模块实现一个类似的一级导航页面("My任务计划 ...
- 关于fiddler抓包一键生成python脚本
本人贡献一篇关于抓包转换成脚本的文章 步骤一 打开fiddler,抓到包之后,保存成txt文件 步骤二 脚本里str_filename改成保存的文件名 步骤三 执行脚本一键转换 附上脚本,感谢关注~ ...
- 3.3 常用Linux命令
1.pwd命令 pwd命令用于显示用户当前所处的工作目录 2.cd命令 cd命令用于切换当前的工作路径,英文全称为"change directory",语法格式为"cd ...