思路:利用深搜选择,线性筛判断素数
注意:这里的搜索不降原则
#include<cstdio>
#include<algorithm>
using namespace std;
int prime[5000005];
bool check[5000005];
int a[25];//储存输入的数
int n,k,ans;
void is_prime(int n){//线性筛法
int cnt=0;
check[1]=true;
for(int i=2;i<=n;i++){
if(!check[i])prime[cnt++]=i;
for(int j=0;j<cnt&&i*prime[j]<=n;j++){
check[i*prime[j]]=true;
if(i%prime[j]==0)break;
}
}
}
bool che(int n){
if(!check[n]){
return true;
}
return false;
}
//排列的不降原则搜索
void dfs(int sum,int step,int startx){//sum表示和,step表示选择了多少数,startx表示升序排列,以免算重复
if(step==k){
if(che(sum)){//判断素数
ans++;
}
return;
}
for(int i=startx;i<n;i++){
dfs(sum+a[i],step+1,i+1);
}
//return ;//这一步骤下,所有的都枚举完了;
}
int main(){
scanf("%d %d",&n,&k);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
is_prime(5000005);//预处理打表
dfs(0,0,0);
printf("%d\n",ans);
return 0;
}