题目
题目描述
已知 个整数 ,以及 个整数 ()。从 个整数中任选 个整数相加,可分别得到一系列的和。例如当 ,, 个整数分别为 时,可得全部的组合与它们的和为:
现在,要求你计算出和为素数共有多少种。
例如上例,只有一种的和为素数:。
输入格式
第一行两个空格隔开的整数 (,)。
第二行 个整数,分别为 ()。
输出格式
输出一个整数,表示种类数。
样例 #1
样例输入 #1
4 3
3 7 12 19
样例输出 #1
1
提示
【题目来源】
NOIP 2002 普及组第二题
解题
方法一:DFS
思路
组合型枚举,多了一步筛选出和为素数的操作。
代码
#include <iostream>
using namespace std;
const int N = 30;
int n, k, a[N];
int cnt = 0;
int b[N], idx;
bool is_prime(int x) {
if (x < 2) return false;
for (int i = 2; i <= x / i; ++i) {
if (x % i == 0) return false;
}
return true;
}
void dfs(int x) {
if (idx == k) {
int sum = 0;
for (int i = 0; i < k; ++i) sum += b[i];
cnt += is_prime(sum);
return;
}
for (int i = x; i < n; ++i) {
b[idx++] = a[i];
dfs(i + 1);
--idx;
}
}
int main() {
scanf("%d%d", &n, &k);
for (int i = 0; i < n; ++i) scanf("%d", &a[i]);
dfs(0);
printf("%d\n", cnt);
return 0;
}
评论区