DFS暴力枚举生成k个数的所有可能排列(去重),并判断其和是否为素数。
// #pragma GCC optimize (2)
// #pragma G++ optimize (2)
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include<math.h>
#include <vector>
#define endl '\n'
#define int long long
#define lowbit(x) x &(-x)
#define rep(i, a, n) for (int i = a; i <= n; i++)
#define TLE(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);}
using namespace std;
typedef long long ll;
const int N = 3e5 + 10;
int a[N],n,k,ans;
bool prime(int x)
{
if(x<=1)return false ;
for(int i=2;i<=sqrt(x);i++)
{
if(x%i==0)return false;
}
return true;
}
void dfs(int t,int st,int ed,int su)
{
if(t==k)
{
if(prime(su))ans++;
return ;
}
for(int i=st;i<=ed;i++)
{
dfs(t+1,i+1,n,su+a[i]);
}
return ;
}
void solve()
{
cin>>n>>k;
rep(i,1,n)cin>>a[i];
dfs(0,1,n,0);
cout<<ans<<endl;
}
signed main()
{
TLE();
int T;
T = 1;
//cin>>T;
while (T--)
solve();
return 0;
}