https://www.luogu.org/problemnew/show/P1036
n才20的数据量,我当时居然还在想怎么分组组合,直接2的20次方暴力搞就行了。
xi太大了,不能事先处理出所有素数。误!多数了一个0!但是一共和的结果最多和选法的次数一样,2的20次方,也就是10的6次方(好像也很多),验证是素数要10的4次方……
原来看错了!那就用埃筛然后暴力判断就好了。
暴力都写了半天,关键在于要在dfs进入的时候立刻处理选择才对。
#include<bits/stdc++.h> using namespace std; #define ll long long int num[10000005]; int p[10000005]; int ptop=0; int ans=0; void init(){ num[0]=1; num[1]=1; for(int i=2;i<=10000000;i++){ if(num[i]==0){ p[ptop++]=i; for(int j=i+i;j<=10000000;j+=i) num[j]=1; } } /*for(int i=0;i<ptop;i++) printf("%d ",p[i]); printf("\n");*/ } int n,k; int a[25]; void dfs(int i,int c,int curk,int sum){ if(curk<0) return; if(i==n){ if(c==0&&curk==0){ //cout<<sum<<endl; if(num[sum]==0){ //cout<<sum<<endl; ans++; } } } else{ if(c==0){ dfs(i+1,0,curk,sum); dfs(i+1,1,curk-1,sum); } else{ sum+=a[i]; dfs(i+1,0,curk,sum); dfs(i+1,1,curk-1,sum); } } } int main(){ init(); scanf("%d%d",&n,&k); for(int i=0;i<n;i++){ scanf("%d",&a[i]); } dfs(0,0,k,0); dfs(0,1,k-1,0); printf("%d\n",ans); }