实在是看不出来了,救救孩子吧
#include <iostream>
#include <vector>
using namespace std;
int n,r;
const int N = 25;
int nums[N];//接收输入
vector<int> ans;//用来存储每次选出来的组合
bool use[N];//标记,用于选数
int cnt;//count计数器
bool is_prime(long long x)//素数判断
{
for(int i=2; i*i<=x; i++)
{
if(x%i==0)
return false;
}
return true;
}
void dfs(int depth)//depth相当于递归树深度,习惯这样表示了,大佬们见谅
{
if(depth == r)
{
long long sum = 0;//这里怕爆数据,不过可能多余了
for(int i=0; i<depth; i++)
{
sum+=ans[i];
}
if(is_prime(sum))
cnt++;
return;
}
for(int i=0; i<n; i++)
{
if(!use[i])
{
if(ans.size() > 0 && ans.back() > nums[i])//这里为了保证当前选出来的数要比上个数大,否则就不和组合的规定
{
continue;
}
//下面就是dfs的模版
use[i] = true;
ans.push_back(nums[i]);
dfs(depth+1);
use[i] = false;
ans.pop_back();
}
}
}
int main()
{
cin>>n>>r;
for(int i=0; i<n; i++)
cin>>nums[i];
dfs(0);
cout<<cnt<<endl;
return 0;
}