1. 数组中的每个元素
2. 数组所有元素的异或和小于等于所有元素的与和。即
小红想知道有多少种可能的方案数。
#include <iostream> using namespace std; int main() { int n, k, mod = 1e9 + 7; std::cin >> n >> k; auto ksm = [&](int x, int y) -> int { if (y < 0) return 0; int ans = 1; while (y) { if (y & 1) ans = 1ll* ans * x % mod; x = 1ll* x * x % mod; y >>= 1; } return ans; }; if (n & 1) { // 全1 + 偶数1,每位独立。因为当全1时,&和^都是1,偶数1,那么&和^都是0,这样就是都是的大小 // 2^n是所有的种类,所以偶数1为2^{n-1} std::cout << ksm(ksm(2, n-1)+1, k) << std::endl; return 0; } // n为偶数时,并不是独立的,因为全为1时,&是1,^为0,那么此时后面位都可以乱选也是符合条件的;那就枚举 int ans = 0; for (int i = 1; i <= k; i ++) { int res = 1ll * ksm(ksm(2, n), i - 1) * ksm(ksm(2, n - 1) - 1, k - i) % mod; ans = (ans + res) % mod; } std::cout << (ans + ksm(ksm(2, n - 1) - 1, k)) % mod << std::endl; }