【蓝桥】软件校内模拟赛(二)反倍数 题目+题解

前言

本题解为第十一届软件类校内模拟赛个人题解,但非官方满分题解,因此,可能存在下列问题

题意理解错误,导致答案错误。
代码中存在一些问题,导致答案错误。
算法复杂度的分析有误,导致不能在规定时间内得出结果。
因报名属于软件类,故本篇题解全部由 C++ 语言完成,第一次进行校内模拟,没有想到无法查看题目,且木得官方题解,因此题目名称是根据问题描述总结(已忘记题目原名称qwq)。

因此蒟蒻在此提供思路为主,附有非题解代码,如有出错(很有可能)欢迎大佬们指正,祝大佬们们在正赛中取得好成绩。

反倍数

题目描述

定三个整数 a, b, c,如果一个整数既不是 a 的整数倍也不是 b 的整数倍还不是 c 的整数倍,则这个数称为反倍数。请问在 1 至 n 中有多少个反倍数。

输入格式
  输入的第一行包含一个整数 n。
  第二行包含三个整数 a, b, c,相邻两个数之间用一个空格分隔。
输出格式
  输出一行包含一个整数,表示答案。
样例输入
30
2 3 6
样例输出
10
样例说明
  以下这些数满足要求:1, 5, 7, 11, 13, 17, 19, 23, 25, 29。
评测用例规模与约定
  对于 40% 的评测用例,1 <= n <= 10000。
  对于 80% 的评测用例,1 <= n <= 100000。
  对于所有评测用例,1 <= n <= 1000000,1 <= a <= n,1 <= b <= n,1 <= c <= n。

这个数据比较小也好整,遍历一遍扫一下用%法取得胜利√

代码:

#include<bits/stdc++.h>
typedef long long ll;
const int inf = 10000000 + 10;
const int sz = 100010;
using namespace std;
#define ri register int
inline void rd(int &x){
	char c=getchar();bool f=0;x=0;
	while(c>'9'||c<'0'){if(c=='-')f=1;c=getchar();}
	while(c<='9'&&c>='0'){x=x*10+c-'0';c=getchar();}
	if(f) x*=-1;}
inline void we(int x){
	if(x<0) putchar('-'),x*=-1;
	if(x/10) we(x/10);
	putchar(x%10+'0');}
int n,t,a,b,c;
int ans,sum,num;
int main()
{
	//std::ios::sync_with_stdio(false);
	rd(n);
	rd(a);rd(b);rd(c);
	for(ri i=1;i<=n;++i)
	{
		if(i%a!=0&&i%b!=0&&i%c!=0)
		num++;
	}
	cout<<num;
	return 0;
}

方法千万条,AC第一条,这里所写的都仅供参考,以大赛官方为准啦,在此摆出以供大佬取其精华,去其糟粕,祝诸位大佬们节节高!

### 蓝桥C++ 竞赛题解 #### 题目A解析 对于给定的计算逻辑,程序通过迭代找到满足特定条件的第一个整数`i`以及对应的`y`值并输出其和。具体实现如下: ```cpp #include <iostream> #include <cmath> int main() { int a = 2019 * 2019; for (int i = 2020;; ++i) { int x = 2 * i * i - a; int y = sqrt(x); if (y * y == x && i < y) { std::cout << i + y << std::endl; break; } } return 0; } ``` 此段代码旨在求解一个数学表达式的最小正整数解[^1]。 #### 关于训练平台的选择 针对蓝桥杯准备而言,不建议仅依赖LeetCode作为主要练习资源。尽管LeetCode提供了大量高质量编程挑战,但这些题目更侧重于求职面试场景下的算法考察,而非竞赛环境中的全面能力测试。相比之下,更适合参与者的备选方案包括其他专注于信息学奥林匹克或ACM风格的比赛网站及教材资料[^2]。 #### 实际比赛策略分享 当面对实际比赛中遇到的问题时,有时采用简单直接的方法而能有效解决问题而不必担心性能瓶颈。例如,在处理某类问题时可以通过简单的线性扫描完成任务而无需构建复杂的多层循环结构来优化效率。下面是一个具体的例子展示了如何利用这一思路快速得出结果: ```cpp #include <iostream> using namespace std; int main() { int n; cin >> n; for (int i = 0; i < n; ++i) { cout << max(i * 2, (n - i - 1) * 2) << endl; } return 0; } ``` 这段代码实现了对一系列数值的最大化操作,并且由于采用了非嵌套的一维遍历方式,确保了即使在较大规模的数据集下也能保持良好的执行速度[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值