zoukankan      html  css  js  c++  java
  • luoguP1036 选数 暴力AC题解

    luoguP1036 选数 暴力AC题解(非正解)

    俗话说得好:暴力出奇迹,打表拿省一。 对于一些暴力就能拿分的题,暴力就好啦QWQ


     题目描述

    输入格式

    输出格式

    输入输出样例

    定义变量

    我们令输入的第一行分别为 n , k ;

    第二行的数由 a [ 25 ] 来存储。

    long long n,k,a[25];

     

     


    题目分析

    1)制作素数筛子

      看完这个题之后,我们需要用到一个判断素数的筛子。可以定义一个函数,如果是素数就返回1,否则返回0.

      判断一个数是不是素数的方法也有很多种。我用的属于直观判断法。

      根据定义,因为质数除了1和本身之外没有其他约数。我们知道,一个数若可以进行因数分解,那么分解时得到的两个数一定是一个小于等于sqrt(n),一个大于等于sqrt(n),据此,代码中并不需要遍历到 n-1 ,遍历到 sqrt(n) 即可,因为若sqrt(n)左侧找不到约数,那么右侧也一定找不到约数。

    bool prime(long long y)
    {
        if (y==1||!y) return 0;
        //判断1和0的情况
         
        for (int i=2;i<=sqrt(y);i++)
            if (!(y%i)) return 0;
            //判断 y%i 是不是=0,如果值为0说明能被整除,不是素数 
          
        return 1; //遍历完之后如果没有返回0,则返回1. 
    }

      这个“素数筛子”就做好了。


    2)暴力循环

      因为是判断 k 个数的和是不是素数,k的范围也不是特别大( 1 ≤ n ≤ 20 ,k < n )

    所以,我们可以用20个 if ,从k=1开始暴力,一直到k=20。在暴力的过程中用一个计数器( tt ) ,来计算是素数的个数。

    long long tt=0;

       暴力也要有方法,不能无脑暴力,不然喜提TLE……

      k=1时:

      只需遍历一遍所有的数,看看它本身是不是素数。 

      此时用到了我们刚才制作的素数筛子。

      分析一下:如果 a [ i ] 为素数,那么prime ( a [ i ] ) 的值就为1,if 满足条件,执行下面的 tt++ 。

      相反的,如果 a [ i ] 不是素数,那么prime ( a [ i ] ) 的值就为0,if 不满足条件,什么都不执行,继续 for 循环直到 i>n。

        if(k==1)
            for(int i=1;i<=n;++i)
            {
                if(prime(a[i]))
                tt++;
            }
    

      k=2时:

      这时 a数组 有2个数组成最终要进行判断的数,我们可以用2层循环,把所有可能的情况都遍历一遍(暴力枚举),如果这两个数的和为素数,计数器+1.

      注意:此时第二层循环的变量为第一次循环变量值+1.( int b = i + 1 , ……那里)这样可以防止出现重复判断的情况,节省了一半的时间。

      另外,判断素数时,prime 括号内的部分为 a [ i ] 与 a [ b ] 之和。

       if(k==2)
            for(int i=1;i<=n;++i)
            for(int b=i+1;b<=n;++b)
            {
                if(prime(a[i]+a[b]))
                tt++;
            }
    

      k=3时:

       同理。3个数相加,遍历一遍,不要忘记下层循环为上层+1.

      在判断素数的时候也不要忘记 prime ( a [ i ] + a [ b ] + a [ c ] )。

         if(k==3)
            for(int i=1;i<=n;++i)
            for(int b=i+1;b<=n;++b)
            for(int c=b+1;c<=n;++c)
            {
                if(prime(a[i]+a[b]+a[c]))
                tt++;
            }
    

      对!就这样!一鼓作气!打出20个 if 吧!……


    AC 代码

    链接:https://www.luogu.com.cn/record/35531313

     瞧瞧这速度!(我想大概 也许可能 是数据有水分)

      1 /*---------------------------------
      2  *Title number:  luoguP1036 选数
      3  *Creation date: 2020-07-22 afternoon
      4  *Author: EdisonBa
      5  *-------------------------------*/
      6 #define fastcall __attribute__((optimize("-O3")))
      7 #pragma GCC optimize(2)
      8 #include<iostream>
      9 #include<cstdio>
     10 #include<string>
     11 #include<cstdlib>
     12 #include<cmath>
     13 #include<stack>
     14 #include<cstring>
     15 #include<iomanip>
     16 #include<algorithm>
     17 #include<map>
     18 #define ll long long
     19 #define itn int 
     20 using namespace std;
     21 
     22 ll n,k,a[25],tt=0;
     23 
     24 bool prime(long long y)
     25 {
     26     if (y==1||!y) return 0;
     27     for (int i=2;i<=sqrt(y);i++)
     28      if (!(y%i)) return 0;
     29     return 1;
     30 }
     31 
     32 int main()
     33 {
     34     cin>>n>>k;
     35     for(int i=1;i<=n;++i)
     36     {
     37         cin>>a[i];
     38     }
     39     
     40     if(k==1)
     41     {
     42         for(int i=1;i<=n;++i)
     43         {
     44             if(prime(a[i]))
     45             tt++;
     46         }
     47     }
     48     if(k==2)
     49     {
     50         for(int i=1;i<=n;++i)
     51         for(int b=i+1;b<=n;++b)
     52         {
     53             if(prime(a[i]+a[b]))
     54             tt++;
     55         }
     56     }
     57     if(k==3)
     58     {
     59         for(int i=1;i<=n;++i)
     60         for(int b=i+1;b<=n;++b)
     61         for(int c=b+1;c<=n;++c)
     62         {
     63             if(prime(a[i]+a[b]+a[c]))
     64             tt++;
     65         }
     66     }
     67     if(k==4)
     68     {
     69         for(int i=1;i<=n;++i)
     70         for(int b=i+1;b<=n;++b)
     71         for(int c=b+1;c<=n;++c)
     72         for(int d=c+1;d<=n;++d)
     73         {
     74             if(prime(a[i]+a[b]+a[c]+a[d]))
     75             tt++;
     76         }
     77     }
     78     if(k==5)
     79     {
     80         for(int i=1;i<=n;++i)
     81         for(int b=i+1;b<=n;++b)
     82         for(int c=b+1;c<=n;++c)
     83         for(int d=c+1;d<=n;++d)
     84         for(int e=d+1;e<=n;++e)
     85         {
     86             if(prime(a[i]+a[b]+a[c]+a[d]+a[e]))
     87             tt++;
     88         }
     89     }
     90     if(k==6)
     91     {
     92         for(int i=1;i<=n;++i)
     93         for(int b=i+1;b<=n;++b)
     94         for(int c=b+1;c<=n;++c)
     95         for(int d=c+1;d<=n;++d)
     96         for(int e=d+1;e<=n;++e)
     97         for(int f=e+1;f<=n;++f)
     98         {
     99             if(prime(a[i]+a[b]+a[c]+a[d]+a[e]+a[f]))
    100             tt++;
    101         }
    102     }
    103     if(k==7)
    104     {
    105         for(int i=1;i<=n;++i)
    106         for(int b=i+1;b<=n;++b)
    107         for(int c=b+1;c<=n;++c)
    108         for(int d=c+1;d<=n;++d)
    109         for(int e=d+1;e<=n;++e)
    110         for(int f=e+1;f<=n;++f)
    111         for(int g=f+1;g<=n;++g)
    112         {
    113             if(prime(a[i]+a[b]+a[c]+a[d]+a[e]+a[f]+a[g]))
    114             tt++;
    115         }
    116     }
    117     if(k==8)
    118     {
    119         for(int i=1;i<=n;++i)
    120         for(int b=i+1;b<=n;++b)
    121         for(int c=b+1;c<=n;++c)
    122         for(int d=c+1;d<=n;++d)
    123         for(int e=d+1;e<=n;++e)
    124         for(int f=e+1;f<=n;++f)
    125         for(int g=f+1;g<=n;++g)
    126         for(int h=g+1;h<=n;++h)
    127         {
    128             if(prime(a[i]+a[b]+a[c]+a[d]+a[e]+a[f]+a[g]+a[h]))
    129             tt++;
    130         }
    131     }
    132         if(k==9)
    133     {
    134         for(int i=1;i<=n;++i)
    135         for(int b=i+1;b<=n;++b)
    136         for(int c=b+1;c<=n;++c)
    137         for(int d=c+1;d<=n;++d)
    138         for(int e=d+1;e<=n;++e)
    139         for(int f=e+1;f<=n;++f)
    140         for(int g=f+1;g<=n;++g)
    141         for(int h=g+1;h<=n;++h)
    142         for(int o=h+1;o<=n;++o)
    143         {
    144             if(prime(a[i]+a[b]+a[c]+a[d]+a[e]+a[f]+a[g]+a[h]+a[o]))
    145             tt++;
    146         }
    147     }
    148         if(k==10)
    149     {
    150         for(int i=1;i<=n;++i)
    151         for(int b=i+1;b<=n;++b)
    152         for(int c=b+1;c<=n;++c)
    153         for(int d=c+1;d<=n;++d)
    154         for(int e=d+1;e<=n;++e)
    155         for(int f=e+1;f<=n;++f)
    156         for(int g=f+1;g<=n;++g)
    157         for(int h=g+1;h<=n;++h)
    158         for(int o=h+1;o<=n;++o)
    159         for(int p=o+1;p<=n;++p)
    160         {
    161             if(prime(a[i]+a[b]+a[c]+a[d]+a[e]+a[f]+a[g]+a[h]+a[o]
    162             +a[p]))
    163             tt++;
    164         }
    165     }
    166     if(k==11)
    167     {
    168         for(int i=1;i<=n;++i)
    169         for(int b=i+1;b<=n;++b)
    170         for(int c=b+1;c<=n;++c)
    171         for(int d=c+1;d<=n;++d)
    172         for(int e=d+1;e<=n;++e)
    173         for(int f=e+1;f<=n;++f)
    174         for(int g=f+1;g<=n;++g)
    175         for(int h=g+1;h<=n;++h)
    176         for(int o=h+1;o<=n;++o)
    177         for(int p=o+1;p<=n;++p)
    178         for(int q=p+1;q<=n;++q)
    179         {
    180             if(prime(a[i]+a[b]+a[c]+a[d]+a[e]+a[f]+a[g]+a[h]+a[o]
    181             +a[p]+a[q]))
    182             tt++;
    183         }
    184     }
    185         if(k==12)
    186     {
    187         for(int i=1;i<=n;++i)
    188         for(int b=i+1;b<=n;++b)
    189         for(int c=b+1;c<=n;++c)
    190         for(int d=c+1;d<=n;++d)
    191         for(int e=d+1;e<=n;++e)
    192         for(int f=e+1;f<=n;++f)
    193         for(int g=f+1;g<=n;++g)
    194         for(int h=g+1;h<=n;++h)
    195         for(int o=h+1;o<=n;++o)
    196         for(int p=o+1;p<=n;++p)
    197         for(int q=p+1;q<=n;++q)
    198         for(int r=q+1;r<=n;++r)
    199         {
    200             if(prime(a[i]+a[b]+a[c]+a[d]+a[e]+a[f]+a[g]+a[h]+a[o]
    201             +a[p]+a[q]+a[r]))
    202             tt++;
    203         }
    204     }
    205         if(k==13)
    206     {
    207         for(int i=1;i<=n;++i)
    208         for(int b=i+1;b<=n;++b)
    209         for(int c=b+1;c<=n;++c)
    210         for(int d=c+1;d<=n;++d)
    211         for(int e=d+1;e<=n;++e)
    212         for(int f=e+1;f<=n;++f)
    213         for(int g=f+1;g<=n;++g)
    214         for(int h=g+1;h<=n;++h)
    215         for(int o=h+1;o<=n;++o)
    216         for(int p=o+1;p<=n;++p)
    217         for(int q=p+1;q<=n;++q)
    218         for(int r=q+1;r<=n;++r)
    219         for(int s=r+1;s<=n;++s)
    220         {
    221             if(prime(a[i]+a[b]+a[c]+a[d]+a[e]+a[f]+a[g]+a[h]+a[o]
    222             +a[p]+a[q]+a[r]+a[s]))
    223             tt++;
    224         }
    225     }
    226     if(k==14)
    227     {
    228         for(int i=1;i<=n;++i)
    229         for(int b=i+1;b<=n;++b)
    230         for(int c=b+1;c<=n;++c)
    231         for(int d=c+1;d<=n;++d)
    232         for(int e=d+1;e<=n;++e)
    233         for(int f=e+1;f<=n;++f)
    234         for(int g=f+1;g<=n;++g)
    235         for(int h=g+1;h<=n;++h)
    236         for(int o=h+1;o<=n;++o)
    237         for(int p=o+1;p<=n;++p)
    238         for(int q=p+1;q<=n;++q)
    239         for(int r=q+1;r<=n;++r)
    240         for(int s=r+1;s<=n;++s)
    241         for(int t=s+1;t<=n;++t)
    242         {
    243             if(prime(a[i]+a[b]+a[c]+a[d]+a[e]+a[f]+a[g]+a[h]+a[o]
    244             +a[p]+a[q]+a[r]+a[s]+a[t]))
    245             tt++;
    246         }
    247     }
    248         if(k==15)
    249     {
    250         for(int i=1;i<=n;++i)
    251         for(int b=i+1;b<=n;++b)
    252         for(int c=b+1;c<=n;++c)
    253         for(int d=c+1;d<=n;++d)
    254         for(int e=d+1;e<=n;++e)
    255         for(int f=e+1;f<=n;++f)
    256         for(int g=f+1;g<=n;++g)
    257         for(int h=g+1;h<=n;++h)
    258         for(int o=h+1;o<=n;++o)
    259         for(int p=o+1;p<=n;++p)
    260         for(int q=p+1;q<=n;++q)
    261         for(int r=q+1;r<=n;++r)
    262         for(int s=r+1;s<=n;++s)
    263         for(int t=s+1;t<=n;++t)
    264         for(int u=t+1;u<=n;++u)
    265         {
    266             if(prime(a[i]+a[b]+a[c]+a[d]+a[e]+a[f]+a[g]+a[h]+a[o]
    267             +a[p]+a[q]+a[r]+a[s]+a[t]+a[u]))
    268             tt++;
    269         }
    270     }
    271         if(k==16)
    272     {
    273         for(int i=1;i<=n;++i)
    274         for(int b=i+1;b<=n;++b)
    275         for(int c=b+1;c<=n;++c)
    276         for(int d=c+1;d<=n;++d)
    277         for(int e=d+1;e<=n;++e)
    278         for(int f=e+1;f<=n;++f)
    279         for(int g=f+1;g<=n;++g)
    280         for(int h=g+1;h<=n;++h)
    281         for(int o=h+1;o<=n;++o)
    282         for(int p=o+1;p<=n;++p)
    283         for(int q=p+1;q<=n;++q)
    284         for(int r=q+1;r<=n;++r)
    285         for(int s=r+1;s<=n;++s)
    286         for(int t=s+1;t<=n;++t)
    287         for(int u=t+1;u<=n;++u)
    288         for(int v=u+1;v<=n;++v)
    289         {
    290             if(prime(a[i]+a[b]+a[c]+a[d]+a[e]+a[f]+a[g]+a[h]+a[o]
    291             +a[p]+a[q]+a[r]+a[s]+a[t]+a[u]+a[v]))
    292             tt++;
    293         }
    294     }
    295         if(k==17)
    296     {
    297         for(int i=1;i<=n;++i)
    298         for(int b=i+1;b<=n;++b)
    299         for(int c=b+1;c<=n;++c)
    300         for(int d=c+1;d<=n;++d)
    301         for(int e=d+1;e<=n;++e)
    302         for(int f=e+1;f<=n;++f)
    303         for(int g=f+1;g<=n;++g)
    304         for(int h=g+1;h<=n;++h)
    305         for(int o=h+1;o<=n;++o)
    306         for(int p=o+1;p<=n;++p)
    307         for(int q=p+1;q<=n;++q)
    308         for(int r=q+1;r<=n;++r)
    309         for(int s=r+1;s<=n;++s)
    310         for(int t=s+1;t<=n;++t)
    311         for(int u=t+1;u<=n;++u)
    312         for(int v=u+1;v<=n;++v)
    313         for(int w=v+1;w<=n;++w)
    314         {
    315             if(prime(a[i]+a[b]+a[c]+a[d]+a[e]+a[f]+a[g]+a[h]+a[o]
    316             +a[p]+a[q]+a[r]+a[s]+a[t]+a[u]+a[v]+a[w]))
    317             tt++;
    318         }
    319     }
    320         if(k==18)
    321     {
    322         for(int i=1;i<=n;++i)
    323         for(int b=i+1;b<=n;++b)
    324         for(int c=b+1;c<=n;++c)
    325         for(int d=c+1;d<=n;++d)
    326         for(int e=d+1;e<=n;++e)
    327         for(int f=e+1;f<=n;++f)
    328         for(int g=f+1;g<=n;++g)
    329         for(int h=g+1;h<=n;++h)
    330         for(int o=h+1;o<=n;++o)
    331         for(int p=o+1;p<=n;++p)
    332         for(int q=p+1;q<=n;++q)
    333         for(int r=q+1;r<=n;++r)
    334         for(int s=r+1;s<=n;++s)
    335         for(int t=s+1;t<=n;++t)
    336         for(int u=t+1;u<=n;++u)
    337         for(int v=u+1;v<=n;++v)
    338         for(int w=v+1;w<=n;++w)
    339         for(int x=w+1;x<=n;++x)
    340         {
    341             if(prime(a[i]+a[b]+a[c]+a[d]+a[e]+a[f]+a[g]+a[h]+a[o]
    342             +a[p]+a[q]+a[r]+a[s]+a[t]+a[u]+a[v]+a[w]+a[x]))
    343             tt++;
    344         }
    345     }
    346         if(k==19)
    347     {
    348         for(int i=1;i<=n;++i)
    349         for(int b=i+1;b<=n;++b)
    350         for(int c=b+1;c<=n;++c)
    351         for(int d=c+1;d<=n;++d)
    352         for(int e=d+1;e<=n;++e)
    353         for(int f=e+1;f<=n;++f)
    354         for(int g=f+1;g<=n;++g)
    355         for(int h=g+1;h<=n;++h)
    356         for(int o=h+1;o<=n;++o)
    357         for(int p=o+1;p<=n;++p)
    358         for(int q=p+1;q<=n;++q)
    359         for(int r=q+1;r<=n;++r)
    360         for(int s=r+1;s<=n;++s)
    361         for(int t=s+1;t<=n;++t)
    362         for(int u=t+1;u<=n;++u)
    363         for(int v=u+1;v<=n;++v)
    364         for(int w=v+1;w<=n;++w)
    365         for(int x=w+1;x<=n;++x)
    366         for(int y=x+1;y<=n;++y)
    367         {
    368             if(prime(a[i]+a[b]+a[c]+a[d]+a[e]+a[f]+a[g]+a[h]+a[o]
    369             +a[p]+a[q]+a[r]+a[s]+a[t]+a[u]+a[v]+a[w]+a[x]+a[y]))
    370             tt++;
    371         }
    372     }
    373         if(k==20)
    374     {
    375         for(int i=1;i<=n;++i)
    376         for(int b=i+1;b<=n;++b)
    377         for(int c=b+1;c<=n;++c)
    378         for(int d=c+1;d<=n;++d)
    379         for(int e=d+1;e<=n;++e)
    380         for(int f=e+1;f<=n;++f)
    381         for(int g=f+1;g<=n;++g)
    382         for(int h=g+1;h<=n;++h)
    383         for(int o=h+1;o<=n;++o)
    384         for(int p=o+1;p<=n;++p)
    385         for(int q=p+1;q<=n;++q)
    386         for(int r=q+1;r<=n;++r)
    387         for(int s=r+1;s<=n;++s)
    388         for(int t=s+1;t<=n;++t)
    389         for(int u=t+1;u<=n;++u)
    390         for(int v=u+1;v<=n;++v)
    391         for(int w=v+1;w<=n;++w)
    392         for(int x=w+1;x<=n;++x)
    393         for(int y=x+1;y<=n;++y)
    394         for(int z=y+1;z<=n;++z)
    395     
    396         {
    397             if(prime(a[i]+a[b]+a[c]+a[d]+a[e]+a[f]+a[g]+a[h]+a[o]
    398             +a[p]+a[q]+a[r]+a[s]+a[t]+a[u]+a[v]+a[w]+a[x]+a[y]+a[z]))
    399             tt++;
    400         }
    401     }
    402     cout<<tt<<endl;
    403     return 0;
    114514 }

    这是本蒟蒻发表的第二篇题解,继承了第一篇题解的暴力传统。

    这是一道橙题,我觉得打这个暴力对付它来说有点小亏。

    不过也顺便锻炼了一下自己的耐力和代码能力

    既然您认真地看完了,点个关注,推荐一下不香嘛!~

    谢谢您的支持!

    2020.8.16

    EdisonBa

  • 相关阅读:
    sas 基础(1)-关于数据格式的SAS函数
    sas 命令行打开SAS IDE 的代码
    获取指定数据集观测数
    sas spawner
    sas 解析json
    正则表达式(更新中。。。)
    async await的简单使用
    element ui只输入数字校验
    element ui中表单循环项的校验
    微信小程序template和组件
  • 原文地址:https://www.cnblogs.com/EdisonBa/p/13362665.html
Copyright © 2011-2022 走看看