思路:利用深搜選擇,線性篩判斷素數
注意:這裏的搜索不降原則
#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;
}