Problem Description
魁地奇是巫师世界中最重要的体育运动。每个人都关注着魁地奇。魁地奇是一种高速进行的,危险而又激动人心的运动,比赛中的两支球队骑着飞天扫帚竞争,每场比赛将鬼飞球投入巨大的草地球场两端圆环次数多的一队获胜。
哈利波特想到了一种必胜的方法,格兰芬多学院里共有N支队(N<=20),每个队已知人数,哈利波特从中挑选K(K<=N)支分队去参加比赛。邓布利多分析后告诉哈利,队伍总人数为素数时,才能必胜!哈利不仅魔法差,数学也差,只听赫敏说过素数是只能被1和自身整除的数,但赫敏现在不在,他请你帮忙计算有多少种必胜的方法。
哈利波特想到了一种必胜的方法,格兰芬多学院里共有N支队(N<=20),每个队已知人数,哈利波特从中挑选K(K<=N)支分队去参加比赛。邓布利多分析后告诉哈利,队伍总人数为素数时,才能必胜!哈利不仅魔法差,数学也差,只听赫敏说过素数是只能被1和自身整除的数,但赫敏现在不在,他请你帮忙计算有多少种必胜的方法。
Input
第一行是测试数据的组数T(T<=10),接下来是各组测试数据,每组测试数据先给出N,K,然后是另起一行N个数字,表示N支部队的人数。
Output
每组测试数据请输出一个整数,表示方案数。
Sample Input
1 5 2 2 3 8 9 999
Sample Output
4
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <algorithm> using namespace std; int count1, k; int n; const int maxn1 = 100+10, maxn2 = 1000000+100; int ans[maxn2], tot; int a[maxn1]; bool Isprime[maxn2]; void getPrime() { tot = 0; memset(Isprime,true,sizeof(Isprime)); for(int i = 2 ;i <= maxn2; i++) { if(Isprime[i]) { tot++; ans[tot] = i; } for(int j = 1; ((j <= tot) && (i*ans[j] <= maxn2)); j++) { Isprime[i*ans[j]] = false; if(i%ans[j] == 0)break; } } } void dfs(int pos,int kk, int sum) { if(kk > k) { //printf("%d\n",sum); if(Isprime[sum]) count1++; /*for(int i = 1; i <= k; i++) { printf("%d ",a[i]); } printf("\n");*/ return; } for(int i = pos+1; i <= n; i++) { dfs(i,kk+1,sum+a[i]); //这意味着第k个数的位置是i; } } int main() { int T = 0; scanf("%d",&T); getPrime(); while(T--) { scanf("%d%d",&n,&k); for(int i = 1; i <= n; i++) { scanf("%d",&a[i]); } count1 = 0; dfs(0,1,0); printf("%d\n",count1); } return 0; }