luoguP1036 选数 暴力AC题解

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

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


 题目描述

luoguP1036 选数 暴力AC题解_第1张图片

 

输入格式

luoguP1036 选数 暴力AC题解_第2张图片

 

输出格式

 

输入输出样例

luoguP1036 选数 暴力AC题解_第3张图片

定义变量

我们令输入的第一行分别为 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

luoguP1036 选数 暴力AC题解_第4张图片

 

 

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

  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
  9 #include
 10 #include<string>
 11 #include
 12 #include
 13 #include
 14 #include
 15 #include
 16 #include
 17 #include
 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<endl;
403     return 0;
114514 }

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

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

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

 

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

谢谢您的支持!

2020.8.16

EdisonBa

 

你可能感兴趣的:(luoguP1036 选数 暴力AC题解)