题目大意:
给定n个数,从中选择k个数,若这k个数和为素数,则ans++
求ans为多少
题目链接
重要部分(二进制枚举):
for (int i = 0; i <= (1 << n); i++)
{
for (int j = 0; j < n; j++)
{
if ((i >> j) & 1)
{
//则二进制这一位为1,代表选择了对应一位的数
}
}
}
假设n为4,则从0000遍历到1111
即
f
o
r
(
i
=
0
;
i
<
10000
(
2
)
;
i
+
+
)
for(i=0;i<10000(2);i++)
for(i=0;i<10000(2);i++)
10000(2)也就是1<<4
然后用内层循环依次向右位移,判断对应位上是否为1
#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
#include<string>
#include<cstdio>
#include<cstdlib>
#include<map>
#include<set>
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
using namespace std;
const int maxn = 22;
bool prime(int x)
{
if (x == 1)
return 0;
for (int i = 2; i*i <= x; i++)
{
if (x%i == 0)
return 0;
}
return 1;
}
int a[maxn];
int main()
{
int n, k;
cin >> n >> k;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
int ans = 0;
for (int i = 0; i <= (1 << n); i++)
{
int cnt = 0;
int sum = 0;
for (int j = 0; j < n; j++)
{
if ((i >> j) & 1)
{
cnt++;
sum += a[j + 1];
}
}
if (cnt != k)
continue;
if (prime(sum))
ans++;
}
cout << ans << "\n";
}```