筛法求素数

int n,m;
long ans;
long a[20];
long prime[10001];  //
bool notprime[10001]={0};
int prime_num=0;
long maxp=10000;


void PR()
{
   for (long i=2;i<=maxp;i++)
   {
      if (!notprime[i])
        prime[prime_num++]=i;
      for (long j=0;j<prime_num && i*prime[j]<=maxp;j++)
        {
           notprime[i*prime[j]]=1;
           if (!(i%prime[j])) break;
        }
   }
   prime_num--;
}   
          

bool check(long s)
{
   if (s==1) return(false);  
   if (s==2) return(true);
   long b=long(sqrt(s));  
   for (long i=0;(i<=prime_num)&&(prime[i]<=b);i++)
       if(s % prime[i]==0) return(false);
   return(true);
}

   


void Search(long sum,int k,int c)
{
    if (k==m)
     {     
       if (check(sum))  ans++;
       return;
       }
    for (int i=c+1;i<n;i++)
        Search(sum+a[i],k+1,i);
}                  
            
             
int main()
{
   freopen("num.in","r",stdin);
  freopen("num.out","w",stdout); 
   scanf("%d%d",&n,&m);
   for (int i=0;i<n;i++)
     scanf("%ld",&a[i]);
     
   //getchar();
   PR();
   Search(0,0,-1);
   printf("%ld\n",ans);
   //getchar();
}

你可能感兴趣的:(筛法求素数)