#include<cstdio>
#include<cmath>
#include<string.h>
using namespace std;
int n,k,sum,ans;
int arr[25];
bool brr[25];
bool is_prime(int n) {//判断素数
if(n <= 1) return 0;
int m = floor(sqrt(n) + 0.5);
for(int i = 2; i <= m; i++) {
if(n % i == 0) return 0;
}
return 1;
}
//hs(a,b) 表示: sum已找到的数的和 a--当前在选的第几个数 b--目前为止找到了几个数
void hs(int a, int b) {
for(int i = a; i <= n; i++) if(!brr[i]){
// 从a~n循环是为了避免重复的出现,例如1234中,选3个,已经选过123
//选完124时,准备为13选下一个数,此时若从1~n循环,则程序会先循环到2,又2此时为true,所以程序又会选2,所以123又再一次出现了,与先前所选出的123相重复
sum += arr[i];//累加
brr[i] = 1;
if(b == k ) {
if(is_prime(sum)) ans++;
}
else hs(i+1,b+1);//注意这个地方是 i + 1
brr[i] = 0;//回溯
sum -= arr[i];
}
return ;
}
int main() {
scanf("%d%d",&n,&k);
for(int i = 1; i <= n; i++) {
scanf("%d",&arr[i]);
}
hs(1,1);//注意不要写hs(0,0)
printf("%d",ans);
return 0;
}
新手村,学会做人选数 https://www.luogu.org/problemnew/show/P1036
最新推荐文章于 2022-02-24 17:41:04 发布