题目描述
已知 𝑛 个整数 𝑥1,𝑥2,⋯ ,𝑥𝑛,以及 1个整数 𝑘(𝑘<𝑛)。从 𝑛 个整数中任选 𝑘个整数相加,可分别得到一系列的和。例如当 𝑛=4,𝑘=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。
输入格式
第一行两个空格隔开的整数 𝑛,𝑘(1≤𝑛≤20,𝑘<𝑛)。
第二行 𝑛n 个整数,分别为 𝑥1,𝑥2,⋯ ,𝑥𝑛(1≤𝑥𝑖≤5×106)。
备注
106表示10的6次方。
输出格式
输出一个整数,表示种类数。
输入输出样例
输入 #1复制
4 3 3 7 12 19
输出 #1复制
1
说明/提示
【题目来源】
NOIP 2002 普及组第二题
AC代码
#include<bits/stdc++.h>
using namespace std;
bool isprime(int a){
for(int i = 2; i * i <= a; i++)
if(a % i == 0)
return false;
return true;
}
int n,k;
int a[25];
long long ls;
void dfs(int m, int sum, int hs){
if(m == k){
if(isprime(sum))
ls++;
return ;
}
for(int i = hs; i < n; i++)
dfs(m + 1, sum + a[i], i + 1);
return ;
}
int main(){
scanf("%d%d",&n,&k);
for(int i = 0; i < n; i++)
scanf("%d",&a[i]);
dfs(0, 0, 0);
printf("%d\n",ls);
return 0;
}