(水题)洛谷 - P1036 - 选数

https://www.luogu.org/problemnew/show/P1036

$n$ 才20的数据量,我当时居然还在想怎么分组组合,直接 $2^{20}$ 暴力搞就行了。

$x_i $太大了,不能事先处理出所有素数。误!多数了一个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);
}

 

posted @ 2019-01-24 16:27  韵意  阅读(159)  评论(0编辑  收藏  举报