莫阿门和伊扎特在玩游戏。他们创建了一个由n个非负整数组成的数组a其中每个元素都小于2k。
当a1&a2&a3&…&an≥a1⊕a2⊕a3⊕…其中&为按位与运算,⊕为按位异或运算。
请计算出Moamen数组a的中奖数量。
由于结果可能非常大,因此输出对1000000007取模的值(109+7)。
分析: 首先肯定要对 n n n 分奇偶,奇数个数字异或起来和偶数个数字异或起来情况肯定是不一样的,
当
n
n
n 为奇数
设
a
1
&
a
2
&
.
.
.
a
n
a_1 \& a_2 \& ... a_n
a1&a2&...an 为
x
x
x,
a
1
⊕
a
2
⊕
a
3
⊕
…
a
n
a_1⊕a_2⊕a_3⊕…a_n
a1⊕a2⊕a3⊕…an 为
y
y
y
x
x
x 最多有
k
k
k 位(
0
0
0 ~
k
−
1
k-1
k−1)
当
x
x
x的第
i
i
i 位为
1
1
1,
y
y
y的第
i
i
i 位一定为
1
1
1(因为奇数个
1
1
1 异或一定为
1
1
1)
当
x
x
x的第
i
i
i 位为
0
0
0,
y
y
y 的第
i
i
i 位为
0
0
0
因为
x
x
x 的第
i
i
i位为
0
0
0, 所以一定有
0
0
0, 然后因为
y
y
y 的第
i
i
i 位必须要为
0
0
0, 所以 只能有偶数个
1
1
1
C
n
0
+
C
n
2
+
C
n
4
.
.
.
.
+
C
n
n
−
1
C^0_n + C^2_n + C^4_n.... + C^{n-1}_n
Cn0+Cn2+Cn4....+Cnn−1
=
=
=
2
n
−
1
2^{n-1}
2n−1
所以为
2
n
−
1
+
1
2^{n-1} + 1
2n−1+1, 这里为什么要
+
1
?
+1?
+1?, 因为可能
x
=
1
,
y
=
1
x = 1, y = 1
x=1,y=1 这种情况也要算上
然后求
2
n
−
1
+
1
2^{n-1} + 1
2n−1+1 的
k
k
k 次幂就可以了, 因为有
k
k
k 位嘛
当 n n n 为偶数
1.当
x
x
x的第
i
i
i 位为
1
1
1,
y
y
y的第
i
i
i 位一定为
0
0
0(因为偶数个
1
1
1 异或一定为
0
0
0)
所以后面随便填就可以了
2.当
x
x
x的第
i
i
i 位为
0
0
0,
y
y
y 的第
i
i
i 位为
0
0
0(一定要有偶数个
0
0
0,且不为
0
0
0, 因为
&
\&
& 出来是
0
0
0 )
对于情况
1
1
1,
a
n
s
+
=
2
(
k
−
i
)
n
ans += 2^{{(k-i)}^n}
ans+=2(k−i)n
对于情况
2
2
2,
a
n
s
+
=
2
n
−
1
−
1
ans += 2^{n - 1} - 1
ans+=2n−1−1
#include<bits/stdc++.h>
#define x first
#define int long long
#define y second
#define gg exit(0);
#define io ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define db printf("debug\n");
const int N = 5e5 + 10, mod = 1e9 + 7;
using namespace std;
typedef pair<int,int>PII;
int T;
int n, k;
int qmi(int a, int b)
{
int res = 1;
while(b)
{
if(b&1) res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
void solve()
{
cin >> n >> k;
if(n % 2 != 0)
{
int sum = (qmi(2, n - 1) + 1 + mod) % mod;
cout << qmi(sum , k) << '\n';
}
else
{
int sum = qmi((qmi(2, n - 1) - 1 + mod )% mod, k);
for(int i = k - 1; i >= 0; i -- )
sum = (sum + qmi((qmi(2, n - 1) - 1 + mod )% mod, k - i - 1) * qmi(qmi(2, i), n)) % mod;
cout << sum << '\n';
}
}
signed main()
{
// io;
// T = 1;
cin >> T;
while(T -- )
solve();
}