测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A27688. 素数种类(prime)

填空题 中等

题目描述

素数种类(prime)

题目描述

已知n个整数X1,X2....Xn以及1个整数k(k<n)。从n个整数中任选k个整数相加,可分别得到一系列的和。现在,要求你计算出和为素数的共有多少种。

输入格式

第一行两个空格隔开的整数n,k(1<n≤20,k<n)。

第二行n个整数,分别为x 1,x 2,......, x n (1≤x i≤5×106)。

输出格式

输出一个整数,表示种类数。

Samples

输入数据 1

4 3

3 7 12 19

输出数据 1

1

样例1解释

当n=4,k=3,4个整数分别为3,7,12,19时,可得全部的组合与它们的和为:

3+7+12=22;

3+7+19=29;

7+12+19=38;

3+12+19=34。

只有一种的和为素数:3+7+19=29,故输出1。

参考答案

#include <iostream> #include <cstdio> using namespace std; int n, k, ans;//ans存储计数结果 int a[25]; //判断素数 bool isprime(int a) { for (int i = 2; i * i <= a; i++) //判断是否有2-根号a的因数 if (a % i == 0) //如果整除,说明除了1和它本身还有别的因数,即不是素数 return false; //程序都到这里的话就说明此为素数 return true; } //最重要的递归 void dfs(int m, int sum, int startx) { //m代表现在选择了多少个数 //sum表示当前的和 //startx表示升序排列,以免算重 if (m == k) { //如果选完了的话 if (isprime(sum)) //如果和是素数 ans++; //ans加一 return ; } for (int i = startx; i < n; i++) dfs(m + 1, sum + a[i], i + 1);//递归 //步数要加一,和也要加 //升序起始值要变成i+1,以免算重 return ;//这一个步骤下,所有的都枚举完了 //直接返回去 } int main() { scanf("%d%d", &n, &k); //输入 for (int i = 0; i < n; i++) scanf("%d", &a[i]); //循环读入 dfs(0, 0, 0); //调用函数 printf("%d\n", ans); //输出答案 return 0; }
上一题 下一题