GESP认证C++编程真题解析 | 202503 五级
欢迎大家订阅我的专栏:算法题解:C++与Python实现!
本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!
专栏特色
1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。
2.系统化学习路径:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。
适合人群:
- 准备参加蓝桥杯、GESP、CSP-J、CSP-S等信息学竞赛的学生
- 希望系统学习C++/Python编程的初学者
- 想要提升算法与编程能力的编程爱好者
附上汇总帖:GESP认证C++编程真题解析 | 汇总
编程题
P11960 平均分配
【题目来源】
洛谷:P11960 [GESP202503 五级] 平均分配 - 洛谷 (luogu.com.cn)
【题目描述】
小 A 有 \(2n\) 件物品,小 B 和小 C 想从小 A 手上买走这些物品。对于第 \(i\) 件物品,小 B 会以 \(b_i\) 的价格购买,而小 C 会以 \(c_i\) 的价格购买。为了平均分配这 \(2n\) 件物品,小 A 决定小 B 和小 C 各自只能买走恰好 \(n\) 件物品。你能帮小 A 求出他卖出这 \(2n\) 件物品所能获得的最大收入吗?
【输入】
第一行,一个正整数 \(n\)。
第二行,\(2n\) 个整数 \(b_1,b_2,…,b_{2n}\)。
第三行,\(2n\) 个整数 \(c_1,c_2,…,c_{2n}\)。
【输出】
一行,一个整数,表示答案。
【输入样例】
3
1 3 5 6 8 10
2 4 6 7 9 11
【输出样例】
36
【算法标签】
《洛谷 P11960 平均分配》 #贪心# #排序# #GESP# #2025#
【代码详解】
#include <bits/stdc++.h>
using namespace std;
#define int long long // 定义宏,将int替换为long long类型
const int N = 100005; // 定义数组的最大大小
int n; // 输入的n值
int b[2*N], c[2*N]; // 存储输入的b数组和c数组
// 定义结构体,存储b值、c值和它们的差值
struct node {
int b, c, diff; // b值,c值,b-c的差值
} a[2*N]; // 结构体数组
// 自定义排序函数,按差值从大到小排序
bool cmp(node x, node y) {
return x.diff > y.diff;
}
signed main() { // 使用signed代替int,因为宏定义了int为long long
cin >> n; // 输入n
// 输入b数组和c数组
for (int i = 1; i <= 2 * n; i++)
cin >> b[i];
for (int i = 1; i <= 2 * n; i++)
cin >> c[i];
// 初始化结构体数组,计算每个元素的差值
for (int i = 1; i <= 2 * n; i++)
a[i] = {b[i], c[i], b[i] - c[i]};
// 对结构体数组按差值从大到小排序
sort(a + 1, a + 2 * n + 1, cmp);
int ans = 0; // 初始化结果为0
// 前n个元素取b值
for (int i = 1; i <= n; i++)
ans += a[i].b;
// 后n个元素取c值
for (int i = n + 1; i <= 2 * n; i++)
ans += a[i].c;
// 输出最终结果
cout << ans << endl;
return 0;
}
【运行结果】
3
1 3 5 6 8 10
2 4 6 7 9 11
36
P11961 原根判断
【题目来源】
洛谷:P11961 [GESP202503 五级] 原根判断 - 洛谷 (luogu.com.cn)
【题目描述】
小 A 知道,对于质数 \(p\) 而言,\(p\) 的原根 \(g\) 是满足以下条件的正整数:
- \(1<g<p\);
- \(g^{p−1}\ mod\ p=1\);
- 对于任意 \(1≤i<p−1\) 均有 \(g^i\ mod\ p=1\)。
其中 \(a\ mod\ p\) 表示 \(a\) 除以 \(p\) 的余数。
小 A 现在有一个整数 \(a\),请你帮他判断 \(a\) 是不是 \(p\) 的原根。
【输入】
第一行,一个正整数 \(T\),表示测试数据组数。
每组测试数据包含一行,两个正整数 \(a,p\)。
【输出】
对于每组测试数据,输出一行,如果 \(a\) 是 \(p\) 的原根则输出 Yes,否则输出 No。
【输入样例】
3
3 998244353
5 998244353
7 998244353
【输出样例】
Yes
Yes
No
【算法标签】
《洛谷 P11961 原根判断》 #原根# #数论# #欧拉函数# #GESP# #2025#
【代码详解】
#include <bits/stdc++.h>
using namespace std;
#define int long long // 定义宏,将int替换为long long类型
int T; // 测试用例的数量
// 快速幂函数,计算a^b mod p
int qmi(int a, int b, int p) {
int res = 1; // 初始化结果为1
while (b) { // 当指数b不为0时循环
if (b & 1) // 如果b的最低位为1
res = res * a % p; // 将当前a乘入结果
a = a * a % p; // a自乘
b >>= 1; // b右移一位
}
return res; // 返回结果
}
signed main() { // 使用signed代替int,因为宏定义了int为long long
cin >> T; // 输入测试用例数量T
while (T--) { // 处理每个测试用例
int a, p;
cin >> a >> p; // 输入a和p
// 检查费马小定理是否成立:a^(p-1) ≡ 1 mod p
if (qmi(a, p - 1, p) != 1) {
cout << "No" << endl; // 不成立则直接输出No
continue;
}
bool flag = true; // 标记是否为原根
// 检查p-1的所有真因子i,判断a^i ≡ 1 mod p是否成立
for (int i = 2; i * i <= p - 1; i++) {
if ((p - 1) % i) continue; // 跳过不是p-1的因子的i
// 如果a^i ≡ 1 mod p或a^((p-1)/i) ≡ 1 mod p,则a不是原根
if (qmi(a, i, p) == 1 || qmi(a, (p - 1) / i, p) == 1) {
flag = false; // 标记为不是原根
break; // 提前退出循环
}
}
// 根据flag输出结果
if (flag)
cout << "Yes" << endl; // 是原根
else
cout << "No" << endl; // 不是原根
}
return 0;
}
【运行结果】
3
3 998244353
Yes
5 998244353
Yes
7 998244353
No

浙公网安备 33010602011771号