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