#include<iostream>
#include <stdlib.h>
#include<math.h>
using namespace std;
int prim=0;
int pr (int sum)
{
int i;
int p=1;
if(sum==1)
p=0;
else
if(sum==2)
p=1;
else
{ if(sum%2==0)
p=0;
else{
for(i=3;i<=sqrt(sum);i+=2)
if(sum%i==0)
{p=0;break;}
}
}
return p;
}
int getones(int n) //取得数n二进制表示的1的个数
{
int count = 0;
while(n)
{
if(n&1)count++;
n >>= 1;
}
return count;
}
void comb(int d[],int m,int n)
{ //n为元素总数,m为要取的元素个数
int i,j,total = 1<<n; //total=2^n,正好是n个元素的所有真子集的个数
for(i = 0; i < total;i++)
{
int sum=0;
if(m == getones(i))
{
for(j = 0; j < n; j++)
if( i & (1<<j))sum=sum+d[j];
//把1左移j位,对应位为1则输出
if(pr(sum))
prim++;
}
}
}
int main(void)
{
int N,K;
while(scanf("%d%d",&N,&K)!=EOF)
{
int a[30];
for(int i = 0; i <N; i++)
cin>>a[i];
comb(a,K,N);
cout<<prim<<'/n';
prim=0;
} //输出10个数中取3个数的子集
return 0;
}
#include<iostream>
#include <stdlib.h>
#include<math.h>
using namespace std;
int prim=0;
int ft(int he){
int i,p=1;
if(he==1)
return 0;
else
if(he==2)
return 1;
else
{
for(i=2;i<=sqrt(he);i++)
{
if(he%i==0)
p=0;
}
return p;
}
}
int getones(int n) //取得数n二进制表示的1的个数
{
int count = 0;
while(n)
{
if(n&1)count++;
n >>= 1;
}
return count;
}
void comb(int d[],int m,int n){ //n为元素总数,m为要取的元素个数
int i,j,total = 1<<n; //total=2^n,正好是n个元素的所有真子集的个数
for(i = 0; i < total;i++)
{int sum=0;
if(m == getones(i))
{
cout<<"{";
for(j = 0; j < n; j++)
{
if( i & (1<<j)){cout<<" "<<d[j]<<" ";sum=sum+d[j];} //把1左移j位,对应位为1则输出
}
cout<<"}"<<sum<<endl;if(ft(sum))prim++;
}
}
}
int main(void)
{
int a[10]={7,6,5};
for(int i = 0; i <10; i++)
{
cout<<a[i]<<'/t';
}
comb(a,2,3); cout<<prim;
getchar(); //输出10个数中取3个数的子集
return 0;
}