题目:p1036 选数
从n个整数中选择k个数,计算它们的和是不是素数
已知 n 个整数 x1,x2,⋯,xn,以及 1 个整数 k(k<n)。从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。例如当 n=4,k=3,4 个整数分别为3,7,12,19 时,可得全部的组合与它们的和为:
3+7+12=22;
3+7+19=29;
3+12+19=34;
7+12+19=38;
只有3+7+19=29这一种情况为素数
输入:一行,n,k
输出:一个整数,表示种类数
import java.io.*;
import java.util.*;
import java.lang.Math;
public class Main{
static int ans;
static int n;
static int k;
public static void main(String[] args){
quickin in=new quickin();
PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
n=in.nextInt();
k=in.nextInt();
int[] c = new int[n];
for(int i=0;i<n;i++){
c[i]=in.nextInt();
}
dfs(0,0,0,c);
pw.println(ans);
pw.flush();
}
public static boolean isprime(int n){
if(n==1) return false;
for(int i=2;i<=Math.sqrt(n);i++){
if(n%i==0){
return false;
}
}
return true;
}
public static void dfs(int m,int sum, int start,int[] c){
if(m==k){
if(isprime(sum)){
ans++;
}
return;
}
for(int i=start;i<n;i++){
dfs(m+1,sum+c[i],i+1,c);
}
return;
}
}
class quickin{
BufferedReader br;
StringTokenizer st;
quickin(){
br = new BufferedReader(new InputStreamReader(System.in));
}
boolean hasNext(){
while(st==null||!st.hasMoreElements()){
try{
st=new StringTokenizer(br.readLine());
}catch(Exception e){
return false;
}
}
return true;
}
String next(){
if(hasNext()) return st.nextToken();
return null;
}
int nextInt(){
return Integer.parseInt(next());
}
}