1 条题解

  • 0
    @ 2026-1-31 21:53:20
    #include <iostream>
    #include <vector>
    #include <cmath>
    using namespace std;
    
    // [1] 全局变量定义
    int n, k;             // n-输入的数字总数,k-需要选取的数字个数
    vector<int> a;        // 存储输入的n个数字
    int ans = 0;          // 统计和为素数的k数组合数量
    
    // [4] 素数判断函数:用long long避免求和溢出,试除法实现
    bool is_prime(long long x) {
        // [4.1] 小于等于1的数不是素数
        if (x <= 1) return false;
        // [4.2] 2是唯一的偶素数
        if (x == 2) return true;
        // [4.3] 大于2的偶数直接排除,非素数
        if (x % 2 == 0) return false;
        // [4.4] 试除法检查奇数:仅需验证3到sqrt(x)的奇数
        for (long long i = 3; i <= sqrt(x); i += 2) {
            if (x % i == 0) return false; // 能被整除则非素数
        }
        // [4.5] 所有验证通过,是素数
        return true;
    }
    
    // [3] DFS递归函数:生成不重复的k数组合并计算和
    // 参数:start-遍历起始索引(防重复),cnt-已选数字数量,sum-当前组合的和
    void dfs(int start, int cnt, long long sum) {
        // [3.1] 递归终止条件:已选够k个数字
        if (cnt == k) {
            // [3.2] 若当前组合和为素数,符合条件的组合数+1
            if (is_prime(sum)) {
                ans++;
            }
            return;
        }
        // [3.3] 从start开始遍历,保证索引递增,避免生成重复组合
        for (int i = start; i < n; i++) {
            // [3.4] 递归下一层:起始索引+1,已选数+1,和累加当前数字
            dfs(i + 1, cnt + 1, sum + a[i]);
        }
    }
    
    // [2] 主函数:处理输入、启动DFS、输出结果
    int main() {
        // [2.1] 输入数字总数n和需选取的个数k
        cin >> n >> k;
        // [2.2] 初始化数组并读取n个输入数字
        a.resize(n);
        for (int i = 0; i < n; i++) {
            cin >> a[i]; // 读取第i个数字存入数组a
        }
        // [2.3] 启动DFS:初始从索引0开始,已选0个,和为0
        dfs(0, 0, 0);
        // [2.4] 输出最终符合条件的组合数量
        cout << ans << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    1272
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者