您的位置:首页 > 其它

递归加暴力打表,求c(n,m)中m种组合方案,总和为素数

2014-05-16 19:24 197 查看

Problem Description

魁地奇是巫师世界中最重要的体育运动。每个人都关注着魁地奇。魁地奇是一种高速进行的,危险而又激动人心的运动,比赛中的两支球队骑着飞天扫帚竞争,每场比赛将鬼飞球投入巨大的草地球场两端圆环次数多的一队获胜。哈利波特想到了一种必胜的方法,格兰芬多学院里共有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;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: