1. 程式人生 > >洛谷 P1036選數

洛谷 P1036選數

題目描述

已知 nnn 個整數 x1,x2,…,xnx_1,x_2,…,x_nx1​,x2​,…,xn​,以及111個整數kkk(k<nk<nk<n)。從nnn個整數中任選kkk個整數相加,可分別得到一系列的和。例如當n=4,k=3n=4,k=3n=4,k=3,444個整數分別為3,7,12,193,7,12,193,7,12,19時,可得全部的組合與它們的和為:

3+7+12=223+7+12=223+7+12=22

3+7+19=293+7+19=293+7+19=29

7+12+19=387+12+19=387+12+19=38

3+12+19=343+12+19=343+12+19=34。

現在,要求你計算出和為素數共有多少種。

例如上例,只有一種的和為素數:3+7+19=293+7+19=293+7+19=29。

輸入輸出格式

輸入格式:

鍵盤輸入,格式為:

n,kn,kn,k(1≤n≤20,k<n1 \le n \le 20,k<n1≤n≤20,k<n)

x1,x2,…,xn(1≤xi≤5000000)x_1,x_2,…,x_n (1 \le x_i \le 5000000)x1​,x2​,…,xn​(1≤xi​≤5000000)

輸出格式:

螢幕輸出,格式為: 111個整數(滿足條件的種數)。

輸入輸出樣例

輸入樣例#1:

4 3
3 7 12 19

輸出樣例#1:

 

1
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int n,k;
int ans = 0; 
int a[23];
bool sushu(int x)
{
	for(int i = 2;i <= sqrt(x);i++)
	{
		if(x % i == 0)return false;
	}
	return true;
}
void dfs(int x,int s,int y)
{
	if(x == n + 1 || y == k)//要麼已經選好了k個數,要麼已經選到了最後一個數 
	{
		if(sushu(s) && y == k)
		{
			ans++;
		}
		return;//這次情況已經選好了就返回去選下一次的
	}
	dfs(x + 1,s + a[x],y + 1);//繼續搜尋選這個數或者不選這個數 
	dfs(x + 1,s,y);
}
int main()
{
	scanf("%d%d",&n,&k);
	for(int i = 1;i <= n;i++)
	{
		scanf("%d",&a[i]);
	}
	dfs(1,0,0);
	printf("%d",ans);
	return 0;
}