zoukankan      html  css  js  c++  java
  • (水题)洛谷

    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("
    ");*/
    }
    
    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
    ",ans);
    }
  • 相关阅读:
    文化因素对商标翻译的影响
    Building An Effective Marketing Plan
    HipHop PHP简介(转)
    关于comet
    TI BSL in python
    剖析 HTTP 协议
    NSIS 打包脚本基础
    图解使用VS的安装项目打包程序
    [Java IO]06_JSON操作
    [Java IO]04_系统标准IO
  • 原文地址:https://www.cnblogs.com/Yinku/p/10315192.html
Copyright © 2011-2022 走看看