洛谷 P1036選數
阿新 • • 發佈:2018-12-10
題目描述
已知 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; }