3 条题解
-
1
#include <iostream> using namespace std; int n,m,x[1005],num; int main (){ cin>>n>>m; for(int i=1;i<=n;i++){ cin>>x[i]; } for(int i=1;i<(1<<n);i++){ if(__builtin_popcount(i)!=m)//判断第i位1的个数是不是等于m { continue; } int cnt = 0; for(int j=0;j<n;j++){ if(i &(1<<j)) { cnt+=x[j+1]; } } bool w=true; for(int j=2;j<=cnt-1;j++){ if(cnt%j==0) { w=false; break; } } if(w){ num+=1; } } cout<<num; return 0; }
细节分析阶段:
- 读取两个整数
n
和m
,其中n
表示接下来要输入的数组x
的长度,m
表示需要从数组x
中选取的数字个数。 - 使用一个长度为1005的整数数组
x
来存储输入的n
个整数。 - 使用一个整数
num
来统计满足条件的组合数量。 - 第一个
for
循环用于读取数组x
中的n
个整数。 - 第二个
for
循环使用位运算来遍历数组x
的所有2^n
种可能子集(包括空集)。i
从1到2^n-1
,每个i
都表示一个特定的子集,其中第j
位为1表示选择了x[j+1]
。 - 使用
__builtin_popcount(i)
函数来计算i
中1的个数,即当前子集包含的元素个数。如果这个个数不等于m
,则跳过当前循环,继续下一个子集。 - 第三个
for
循环计算当前子集中所有数字的和cnt
。 - 接下来的代码块检查
cnt
是否为质数。如果cnt
可以被2到cnt-1
之间的任何数字整除,则cnt
不是质数,将w
设为false
并跳出循环。如果cnt
是质数,则将num
增加1。 - 最后,输出
num
,即满足条件的组合数量。
总结阶段:
这段代码的目的是找出数组
x
中选取m
个数字的所有可能组合中,哪些组合的和是质数,并统计这样的组合有多少个。代码使用位运算来生成所有可能的子集,并使用内建函数__builtin_popcount
来检查每个子集中的元素个数。然后,它检查每个子集的和是否为质数,并相应地更新计数器num
。最后,输出计数结果。 - 读取两个整数
-
0
#include<bits/stdc++.h> using namespace std; int n,m,x[1005],num; int main (){ cin>>n>>m; for(int i=1;i<=n;i++){ cin>>x[i]; } for(int i=1;i<(1<<n);i++){ if(__builtin_popcount(i)!=m)//判断第i位1的个数是不是等于m { continue; } int cnt = 0; for(int j=0;j<n;j++){ if(i &(1<<j)) { cnt+=x[j+1]; } } bool w=true; for(int j=2;j<=cnt-1;j++){ if(cnt%j==0) { w=false; break; } } if(w){ num+=1; } } cout<<num; return 0; }
-
-1
#include <bits/stdc++.h> using namespace std; int n,k,a[20],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]; int bo=1; for(int j=2;j*j<=sum;j++) if(sum%j==0){bo=0;break;} if(bo)ans++; } cout<<ans; return 0;}
- 1
信息
- ID
- 612
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 197
- 已通过
- 92
- 上传者