#include<iostream>
#include<cmath>
using namespace std;
const int N = 25;
int n, k;
int a[N];
long long ans;
bool isPrime(int num) { //判断是否为质数的函数
if (num == 1 || num == 0) return false;
for (int i = 2; i <= sqrt(num); i++) {
if (num % i == 0)return false;
}
return true;
}
void dfs(int u,int path,int start) { //此时有三个形参,第一个形参代表搜索层数,第二个代表求和,第三个代表对数组的搜索进度
if (u == k) {
if (isPrime(path))ans++;
return;
}
for (int i = start; i < n; i++) { //每次都以start为开始,避免数字重复选择
dfs(u + 1,path + a[i], i + 1); //同样都以形参形式递归,不需单独回溯
}
return;
}
int main() {
cin >> n >> k;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
dfs(0, 0, 0);
cout << ans;
return 0;
}
洛谷 P1036 [NOIP2002 普及组] 选数
于 2023-12-27 22:32:18 首次发布