基本的思路就是DFS
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 30;
int n, k, ans = 0, sum = 0;
int a[N], path[N];
bool st[N];
bool isPrime(int num)
{
if(num < 2) return false;
for(int i = 2; i<=num/ i; i++)
{
if(num % i == 0)
{
return false;
}
}
return true;
}
void dfs(int u) //u代表枚举到了第几个数
{
if(u >= k + 1)
{
//for(int i = 1; i<=k; i++) printf("%d ", path[i]);
//puts("");
for(int i = 1; i<=k; i++) sum += path[i];
if(isPrime(sum)) ans++;
//ans++;
return;
}
for(int i = 1; i<=n; i++)
{
if(!st[i] && path[u - 1] <= a[i])
{
sum += a[i];
st[i] = true;
path[u] = a[i];
dfs(u + 1);
//恢复现场
st[i] = false;
}
}
}
int main()
{
cin>>n>>k;
for(int i = 1; i<=n; i++)
{
cin>>a[i];
}
dfs(1);
cout<<ans<<endl;
return 0;
}