boolisPrime(int n) { if (n <= 3) { return n >= 2; } else { for (int i = 2; i * i <= n; ++i) { if (n % i == 0) returnfalse; } returntrue; } }
intpopcount(int n)// 判断一个数在二进制下有几个1 { int cnt = 0; while (n > 0) { if (n % 2) ++cnt; n /= 2; } return cnt; }
intmain() { int n, k; cin >> n >> k; int cnt = 0; vector<int> nums(n); for (int i = 0; i < n; ++i) { cin >> nums[i]; } int U = 1 << n; // 全集U for (int i = 0; i < U; ++i) // i是U的子集,遍历U的所有子集 { if (popcount(i) == k) // 找到k个元素的子集 { int sum = 0; for (int j = 0; j < n; ++j) { if (i & (1 << j)) // 如果第j个元素在子集i中 sum += nums[j]; } if (isPrime(sum)) ++cnt; } } cout << cnt; return0; }