本题的思路应该就是先筛选出一个素数表。。不过数据范围太大20*5000000,直接上筛法肯定爆空间,所以我们需要优化一下,我们这时候可以直接判断是不是素数时间复杂度sqrt(n),然后我们应该搜索所有的k个数字的组合,dfs搜索下,可以分为当前选或者不选,选了之后记得回溯现场,边界条件判断一下,是否递归到了选到了第k个数字了。
import java.io.BufferedInputStream;
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
static Scanner cin = new Scanner(new BufferedInputStream(System.in));
static int n,k;
static final int maxn = 20+10;
static int[] a = new int[maxn];
static int[] vis = new int[10000000];
static int sum = 0;
/*
* 欧拉筛
*/
static int[] vis1= new int[200];
static void prime(int sum)
{
for(int i = 2 ;i*i<sum;i++)
{
if(vis[i]==0)
{
for(int j = i*i;j<=sum;j+=i)
{
vis[j] = 1;
}
}
}
}
static boolean prime1(int sum)
{
for(int i =2;i*i<=sum;i++)
{
if(sum%i==0)
{
return false;
}
}
return true;
}
static long res = 0;
static int sum1 = 0;
static int cnt = 0;
static void dfs(int n,int k,int step)///取不取
{
if(step>n) return;
dfs(n,k,step+1);
sum1 += a[step];
cnt++;
//System.out.println(cnt+" "+sum1);
if(cnt==k&&prime1(sum1))
{
res++;
}else if(cnt<k)
{
dfs(n,k,step+1);
}
sum1 -=a[step];
cnt--;
return;
//回溯现场
}
public static void main(String[] args)
{
n = cin.nextInt();
k = cin.nextInt();
for(int i = 1;i<=n;i++)
{
a[i] = cin.nextInt();
sum +=a[i];
}
dfs(n,k,1);
System.out.println(res);
}
}