1

噢莫加纳加加加  •  17天前


#include <iostream>
#include <cstdio>
using namespace std;

bool isprime(int a) { //判断素数

	for (int i = 2; i * i <= a; i++)
		if (a % i == 0) //如果整除
			return false;//扔回false
	//程序都到这里的话就说明此为素数
	//否则就被扔回了
	return true;//扔回true
}

int n, k;
int a[25];
long long ans;

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;//结束程序
}

评论:

请先登录,才能进行评论