16 条题解
-
55
P1014 选数
题目描述
已知 n 个整数 ,x1,x2,⋯,xn,以及 1 个整数 k(k<n)。从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。
现在,要求你计算出和为素数共有多少种。
思路
n个里面选K个,数据不大,可以使用子集枚举。
bool func(int x){ for(int i=2;i<=sqrt(x);i++) if(x%i==0) return 0; return 1; }
①定义函数
int n, m, s, a[25];
②定义变量int i=1; cin >> n >> m; for(;i<=n;i++)cin>>a[i]; for (int i = 1; i < (1 << n); i++) { if (__builtin_popcount(i)!=m) continue; int sum=0; for (int j = 0; j < n; j++) if (i & (1 << j)) sum+=a[j]; if(func(sum))s++; }cout<<s; return 0;
③输入+输出+子集枚举 but 别忘了j是从0开始的 所以:
int i=1; cin >> n >> m; for(;i<=n;i++)cin>>a[i]; for (int i = 1; i < (1 << n); i++) { if (__builtin_popcount(i)!=m) continue; int sum=0; for (int j = 0; j < n; j++) if (i & (1 << j)) sum+=a[j+1]; if(func(sum))s++; }cout<<s; return 0;
所以 答案是这样的:
#include <bits/stdc++.h> using namespace std; bool func(int x){ for(int i=2;i<=sqrt(x);i++) if(x%i==0) return 0; return 1; }int n, m, s, a[25]; int main() { int i=1; cin >> n >> m; for(;i<=n;i++)cin>>a[i]; for (int i = 1; i < (1 << n); i++) { if (__builtin_popcount(i)!=m)//判断是否符合数量 continue; int sum=0; for (int j = 0; j < n; j++) if (i & (1 << j)) sum+=a[j+1]; if(func(sum))s++; }cout<<s; return 0; }
温馨提示:k就是这里面的m
制作不易,点赞带走
-
17
P1014 选数
题目描述
已知 n 个整数 ,x1,x2,⋯,xn,以及 1 个整数 k(k<n)。从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。
现在,要求你计算出和为素数共有多少种。
思路
n个里面选K个,数据不大,可以使用子集枚举。
不过,可先编写一个素数函数
int check(int f) { for(int i = 2;i < f;i++) { if(f % i == 0) { return false; } } return true; }
挨个数原理。
限定元素个数可以使用
__builtin_popcount(i)
函数,让他等于题目要求的k。if (__builtin_popcount(i) != k) { continue; }
在加上一些基础的子集枚举代码即可。
参考代码
#include <iostream>//hetao3097453 using namespace std; int a[21],num,sum,n,k; int check(int f) { for(int i = 2;i < f;i++) { if(f % i == 0) { return false; } } return true; } int main() { cin >> n >> k; for (int i = 1;i <= n;i++) { cin >> a[i]; } for (int i = 1;i < (1 << n);i++) { if (__builtin_popcount(i) != k) { continue; } sum = 0; for (int j = 0;j < n;j++) { if (i & (1 << j)) { sum += a[j + 1]; } } if(check(sum)) { num++; } } cout << num; return 0; }
hetao3097453
2023年4月2日
-
7
P1014号题解已送达 滴~已查收
#include <iostream> using namespace std; int n, k, a[21], ans; int main() { cin >> n >> k; for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i < (1 << n); i++) { if (__builtin_popcount(i) != k) continue; int sum = 0; for (int j = 0; j < n; j++) if (i & (1 << j)) sum += a[j + 1]; bool ok = true; for (int j = 2; j * j <= sum; j++) { if (sum % j == 0) { ok = false; break; } } if (ok) ans++; } cout << ans; return 0; }
-
7
题目要求n个里面选k个,可以使用自己枚举,用__builtin_popcount函数限定元素个数等于k。
对每种情况,求出选出的数的总和sum,并判断总和sum是不是质数:可以让j从2到根号sum,判断j是否是sum的因数。如果是因数,把表示sum是不是质数的变量ok赋值为false。ok的初始值是true,如果最终ok是true,就把ans加1。
最终输出ans即可。
代码
#include <iostream> using namespace std; int n, k, a[21], ans; int main() { cin >> n >> k; for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i < (1 << n); i++) { if (__builtin_popcount(i) != k) continue; int sum = 0; for (int j = 0; j < n; j++) if (i & (1 << j)) sum += a[j + 1]; bool ok = true; for (int j = 2; j * j <= sum; j++) { if (sum % j == 0) { ok = false; break; } } if (ok) ans++; } cout << ans; return 0; }
-
6
P1014
-题目回顾-
已知 n 个整数 ,x1,x2,⋯,xn,以及 1 个整数 k(k<n)。从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。
现在,要求你计算出和为素数共有多少种。
-分析-
用子集枚举呗,还能怎样?代码可以参考L9-5练习7
-代码-
#include <bits/stdc++.h>// by AGOMG using namespace std; int n, m, a[25], num; bool cheek(int x)//质数检查 { for(int i = 2; i * i <= x; i++) { if(x % i == 0) return false; } return true; } int main() { cin >> n >> m; for(int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i < (1 << n); i++) { if (__builtin_popcount(i) != m) continue; int sum = 0; for (int j = 0; j < n; j++) if (i & (1 << j)) sum += a[j + 1]; if(cheek(sum)) num++; } cout << num; return 0; }
-
4
要判断素数,所以先编写一个判断素数的函数
bool { for (int i = 2; i <= sqrt(x); i++) if (x % i == 0) return false; return true; }
然后用子集枚举
#include <bits/stdc++.h> using namespace std; int n, k, a[25], num = 0; ```int main() { cin >> n >> k; for (int i = 0; i < n; i++) cin >> a[i]; for (int i = 0; i < (1 << n); i++) { int sum = 0; for (int j = 0; j < n; j++) { if (__builtin_popcount(i) != k) continue; if (i & (1 << j)) sum += a[j]; } if (s(sum) && sum != 0) num++; } cout << num; return 0; }
合起来:
#include <bits/stdc++.h> using namespace std; int n, k, a[25], num = 0; bool s(int x) { for (int i = 2; i <= sqrt(x); i++) if (x % i == 0) return false; return true; } int main() { cin >> n >> k; for (int i = 0; i < n; i++) cin >> a[i]; for (int i = 0; i < (1 << n); i++) { int sum = 0; for (int j = 0; j < n; j++) { if (__builtin_popcount(i) != k) continue; if (i & (1 << j)) sum += a[j]; } if (s(sum) && sum != 0) num++; } cout << num; return 0; }
编写不易,点赞拿走.😄 .
-
1
#include <iostream>//hetao819473 using namespace std; int a[21],num,sum,n,k; int check(int f) { for(int i = 2;i < f;i++) { if(f % i == 0) { return false; } } return true; } int main() { cin >> n >> k; for (int i = 1;i <= n;i++) { cin >> a[i]; } for (int i = 1;i < (1 << n);i++) { if (__builtin_popcount(i) != k) { continue; } sum = 0; for (int j = 0;j < n;j++) { if (i & (1 << j)) { sum += a[j + 1]; } } if(check(sum)) { num++; } } cout << num; return 0; }
-
1
凭借着我对讲义的熟悉程度,我的手控制我写出了这段AC代码:
#include <iostream> #include <algorithm> #include <cmath> using namespace std; typedef long long ll; ll n,k,x[25],ans; bool prime(ll a) { for (int i=2;i<sqrt(a);i++) if (a%i==0) return 0; return 1; } int main() { cin>>n>>k; for (int i=1;i<=n;i++) cin>>x[i]; for (int i=1;i<(1<<n);i++) { ll sum=0; if (__builtin_popcount(i)!=k) continue; for (int j=0;j<n;j++) if (i&(1<<j)) sum+=x[j+1]; if (prime(sum)) ans++; } cout<<ans; return 0; }//麻雀虽小,五脏俱全
-
1
#include <bits/stdc++.h> using namespace std; bool func(int x){ for(int i=2;i<=sqrt(x);i++) if(x%i==0) return 0; return 1; }int n, m, s, a[25]; int main() { int i=1; cin >> n >> m; for(;i<=n;i++)cin>>a[i]; for (int i = 1; i < (1 << n); i++) { if (__builtin_popcount(i)!=m) continue; int sum=0; for (int j = 0; j < n; j++) if (i & (1 << j)) sum+=a[j+1]; if(func(sum))s++; }cout<<s; return 0; }
-
1
伪代码↓
#include<bits/stdc++.h> using namespace std; 定义 n,k,x[21],sum,ans; int main() { 输入 n,k,x[i]; 遍历子串 如果子串长度不等于k continue; sum=子串所有元素之和; 如果sum是质数 ans加一; 输出ans; return 0; }//hetao6109326
AC代码↓
#include<bits/stdc++.h> using namespace std; int n,k,x[21],sum,ans; bool prime(int a) { for(int i=2;i*i<=a;i++) if(a%i==0) return false; return true; } int main() { cin>>n>>k; for(int i=0;i<n;i++) cin>>x[i]; for(int i=1;i<(1<<n);i++) { if(__builtin_popcount(i)!=k) continue; sum=0; for(int j=0;j<n;j++) if(i&(1<<j)) sum+=x[j]; if(prime(sum)) ans++; } cout<<ans; return 0; }//hetao6109326
-
1
#include <iostream>//hetao3097453 using namespace std; int a[21],num,sum,n,k; int check(int f) { for(int i = 2;i < f;i++) { if(f % i == 0) { return false; } } return true; } int main() { cin >> n >> k; for (int i = 1;i <= n;i++) { cin >> a[i]; } for (int i = 1;i < (1 << n);i++) { if (__builtin_popcount(i) != k) { continue; } sum = 0; for (int j = 0;j < n;j++) { if (i & (1 << j)) { sum += a[j + 1]; } } if(check(sum)) { num++; } } cout << num; return 0; }
-
1
#include <bits/stdc++.h> using namespace std; int n,x[25],k,sum,ans; bool prime(int w)//判断质数 { if (w == 1) { return 0; } for (int i = 2;i * i < w;i++) { if (w % i == 0) { return 0; } } return 1; } int main() { cin >> n >> k; for (int i = 0;i < n;i++) { cin >> x[i]; } for (int i = 1;i < (1 << n);i++)//子集枚举 { if (__builtin_popcount(i) != k)//过数量这关 { continue; } sum = 0;//初始化 for (int j = 0;j < n;j++) { if (i & (1 << j)) { sum += x[j];//此组合中有此数,总和累加 } } if (prime(sum))//判断总和 { ans++;//答案加一 } } cout << ans;//输出 return 0; }//已AC,请放心使用 //认准本人有限公司(呵呵)MJKLIUJYTGRSGJKJHTGFDVMJGGFDVBVHFDSGJRTGJU&%RFJU……Y%TRFGJKRGFJGHN本日第2篇题解出品了
-
1
#include <bits/stdc++.h> using namespace std; bool prime(int x){ if(x<2)return false; for(int i=2;i*i<=x;i++)if(x%i==0)return false; return true; } int main(){ int n,k,a[25],sum=0,cnt=0; scanf("%d%d",&n,&k); for(int i=1;i<=n;i++)scanf("%d",&a[i]); for(int i=1;i<(1<<n);i++){ if(__builtin_popcount(i)!=k)continue; sum=0; for(int j=0;j<n;j++)if(i&(1<<j))sum+=a[j+1]; if(prime(sum))cnt++; } printf("%d\n",cnt); return 0; }
这里要注意的是prime函数要优化,不能列举2~x-1了;其次是要用__builtin_popcount函数,最后j别忘+1
-
-1
#include <bits/stdc++.h> using namespace std; bool func(int x){ for(int i=2;i<=sqrt(x);i++) if(x%i==0) return 0; return 1; }int n, m, s, a[25]; int main() { int i=1; cin >> n >> m; for(;i<=n;i++)cin>>a[i]; for (int i = 1; i < (1 << n); i++) { if (__builtin_popcount(i)!=m)//判断是否符合数量 continue; int sum=0; for (int j = 0; j < n; j++) if (i & (1 << j)) sum+=a[j+1]; if(func(sum))s++; }cout<<s; return 0; }
-
-10
#include <iostream> using namespace std; int a[21],num,sum,n,k; int check(int f) { for(int i = 2;i < f;i++) { if(f % i == 0) { return false; } } return true; } int main() { cin >> n >> k; for (int i = 1;i <= n;i++) { cin >> a[i]; } for (int i = 1;i < (1 << n);i++) { if (__builtin_popcount(i) != k) { continue; } sum = 0; for (int j = 0;j < n;j++) { if (i & (1 << j)) { sum += a[j + 1]; } } if(check(sum)) { num++; } } cout << num; return 0; }
- 1
信息
- ID
- 52
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 2404
- 已通过
- 1190
- 上传者