/*
Author: SJ
*/
#include <bits/stdc++.h>
using namespace std;
int a[30];
int n, k, ans;
bool is_prime(int x) {
if (x == 1 || x == 0) return false;
for (int i = 2; i * i <= x; i++) {
if (x % i == 0) return false;
}
return true;
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
cin >> n >> k;
for (int i = 0; i < n; i++) cin >> a[i];
int u = 1 << n;
for (int s = 0; s < u; s++) {
if (__builtin_popcount(s) == k) { //__builtin_popcount是一个数二进制数位数中有几位是1的内建函数,手写也很简单。
int sum = 0;
for (int i = 0; i < n; i++)
if (s & (1 << i)) sum += a[i];
if (is_prime(sum)) ans++;
}
}
cout << ans;
return 0;
}
1.学习了用二进制数加位运算来枚举集合的技巧。
Leetcode 136:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ans = 0;
for (int i = 0; i < nums.size(); i++) {
ans ^= nums[i];
}
return ans;
}
};
1.复习了异或运算的交换律即: a ^ b ^ c = a ^ c ^ b;
2.复习了几条性质: a ^ a = 0, a ^ 0 = a;