#include<bits/stdc++.h>
using namespace std;
int nums[1001],p[1001];
int st[1001];//检查是否访问
int sum;
int n,k,ct;
int su(int num)
{
for(int i=2;i*i<num;i++)
if(num%i==0)
return 0;
return 1;
}
void dfs(int u)
{
if(u==k&&su(sum))
{
ct++;
return;
}
for(int i=0;i<n;i++)
{
if(st[i]==0)
{
sum+=nums[i];
st[i]=1;
dfs(u+1);
//执行后恢复该盒子
st[i]=0;
sum-=nums[i];
}
}
}
int main(void)
{
int o=1;
cin>>n>>k;
for(int i=1;i<=k;i++)
o*=i;
for(int i=0;i<n;i++)
{
cin>>nums[i];
p[i]=i;
}
dfs(0);
cout<<ct/o<<endl;
}
DFS处理,暴力遍历所有可能,但是a+b+c和b+a+c和c+a+b......顺序不同为一种,可以考虑再建一个数组帮助筛选,但是,作者比较蠢货,不太想得明白数组的具体逻辑,所以直接最后结果除k的阶乘即可
好像也不需要数组,一个数就够了,这个是自己想的具体代码逻辑不一定对
#include<bits/stdc++.h>
using namespace std;
int nums[1001],p[1001];
int st[1001];//检查是否访问
int sum;
int n,k,ct;
int su(int num)
{
for(int i=2;i*i<num;i++)
if(num%i==0)
return 0;
return 1;
}
void dfs(int u,int p)
{
if(u==k&&su(sum))
{
ct++;
return;
}
for(int i=0;i<n;i++)
{
if(st[i]==0&&i>=p)
{
sum+=nums[i];
st[i]=1;
dfs(u+1,i);
//执行后恢复该盒子
st[i]=0;
sum-=nums[i];
}
}
}
int main(void)
{
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>nums[i];
p[i]=i;
}
dfs(0,0);
cout<<ct<<endl;
}