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