1

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
posted @ 2026-01-17 09:11  热爱编程的通信人  阅读(3)  评论(0)    收藏  举报