题目描述
已知 n 个整数 x1,x2,⋯,xn,以及 1 个整数 k(k<n)。从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为:
3+7+12=22
3+7+19=29
7+12+19=38
3+12+19=34
现在,要求你计算出和为素数共有多少种。
例如上例,只有一种的和为素数:3+7+19=29。
输入格式
第一行两个空格隔开的整数 n,k(1≤n≤20,k<n)。
第二行 n 个整数,分别为 x1,x2,⋯,xn(1≤xi≤5×10^6)。
输出格式
输出一个整数,表示种类数。
输入输出样例
输入 #1
4 3 3 7 12 19
输出 #1
1
说明/提示
【题目来源】
NOIP 2002 普及组第二题
【分析】
每个数只有选和不选两种可能,就可以用二进制来模拟,再用next_permutation函数来进行全排列。
【AC代码】
/*
next_permutation
*/
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int a[30], b[30];
int main() {
int n, k;
cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = n; i > n - k; i--) {
b[i] = 1;
}
int ans = 0;
do {
int cnt = 0;
for (int i = 1; i <= n; i++) {
if (b[i] == 1) {
cnt += a[i];
}
}
int flag = 0;
for (int i = 2; i <= sqrt(cnt); i++) {
if (cnt % i == 0) {
flag = 1;
break;
}
}
if (flag == 0) {
ans++;
}
} while (next_permutation(b + 1, b + n + 1)); //全排列函数
cout << ans << endl;
return 0;
}