#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define int long long
#define endl '\n'
const double PI = acos(-1.0);
typedef pair<int,int> PII;
const int INF = 0x3f3f3f3f;
const int modn = 1e9;
const int N = 1e8;
bool vis[25];
int a[25];
int n,k;
int ans=0;
int prime[N];//最小素因子
int visit[N];//素数
void Prime(){
for (int i = 2;i <= N; i++) {
if (!visit[i]) {
prime[++prime[0]] = i; //纪录素数, 这个prime[0] 相当于 cnt,用来计数
}
for (int j = 1; j <=prime[0] && i*prime[j] <= N; j++) {
visit[i*prime[j]] = 1;
if (i % prime[j] == 0) { //只需筛最小素因子
break;
}
}
}
}
void dfs(int x,int se,int sum){
if(se==k){
if(!visit[sum]){
ans++;
return;
}
}
for(int i=x;i<n;i++){
if(!vis[i]){
vis[i]= true;
dfs(i,se+1,sum+a[i]);
vis[i] = false;
}
}
}
void solve(){
Prime();
cin>>n>>k;
for(int i=0;i<n;i++){
cin>>a[i];
}
//vis[0]= true;
dfs(0,0,0);
cout<<ans<<endl;
}
signed main(){
//ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int _=1;
//cin>>_;
//getchar();
while(_--){
solve();
}
return 0;
}
以上是线性筛版本的代码,dfs主体没变就变了个判断素数。。然后我发现用普通的判断素数是可以ac的,但是用线性筛就mle了,有大佬分析一下吗0.0