乱求一通排列数之后就A了
#include<bits/stdc++.h>
using namespace std;
int n,m,a[25],v[25],ans=0,t[25];
bool is_prime(int k){
for(int i=2;i*i<=k;i++){
if(k%i==0) return 0;
}
return 1;
}
void dfs(int step,int sum){
if(step>m){
if(is_prime(sum)){
ans++;
}
return;
}
for(int i=1;i<=n;i++){
if(v[i]==0&&a[i]>=t[step-1]){
v[i]=1;
t[step]=a[i];
dfs(step+1,sum+a[i]);
v[i]=0;
}
}
}
int pl(int nn,int mm){
int cnt1=1,cnt2=1;
for(int i=mm;i>=1;i--){
cnt2*=i;
}
for(int i=nn;i>=nn-mm+1;i--){
cnt1*=i;
}
return cnt1/cnt2;
}
int main(){
bool flag=1;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]!=1) flag=0;
}
if(flag){
cout<<pl(n,m);
return 0;
}
dfs(1,0);
cout<<ans;
return 0;
}