题目:
https://www.luogu.com.cn/problem/P1036
题目描述
已知 nn 个整数 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
7+12+19=38
3+12+19=34
现在,要求你计算出和为素数共有多少种。
例如上例,只有一种的和为素数:3+7+19=29。
输入格式
第一行两个空格隔开的整数 n,k(1≤n≤20,k<n)。
第二行 n 个整数,分别为 x1,x2,⋯ ,xn(1≤xi≤5×10的6次方)。
思路:就是暴力枚举,最后加一个是否是素数的判断
代码如下:
#include<iostream>
using namespace std;
typedef long long ll;
ll n,k;
ll num[25];
ll arr[25];
ll res = 0;
bool is_prime(ll m)
{
for(ll i = 2 ; i * i <= m ; i++)
{
if(m % i == 0)
return false;
}
return true;
}
void dfs(ll x,ll sum,ll start)
{
if(x > k)
{
if(is_prime(sum))
{
res++;
}
return;
}
for(ll i = start ; i <= n ;i++)
{
arr[x] = num[i];
dfs(x+1,sum + arr[x],i+1);
arr[x] = 0;
}
}
int main()
{
cin >> n >> k;
for(ll i = 1 ; i <= n ; i++)
cin >> num[i];
dfs(1,0,1);
cout << res <<endl;
return 0;
}