1. 程式人生 > 實用技巧 >luoguP1036 選數 暴力AC題解

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.7.22

EdisonBa