CF Moamen and XOR
奇数个1异或为1,偶数个1异或为0
记 x = ∑ i = 2 n a i − 1 & a i x=\sum_{i=2}^na_{i-1}\&a_i x=∑i=2nai−1&ai y = ∑ i = 2 n a i − 1 x o r a i y=\sum_{i=2}^n a_{i-1}xora_i y=∑i=2nai−1xorai
n为偶数时
第 x i x_i xi为1时,说明这 n n n个数的第 i i i为全为1,而 y i y_i yi为则必定为0
若 x i x_i xi为0,则 y i y_i yi为为0的情况为 C n 0 + C n 2 + . . . + C n n − 2 + C n n − C n n = 2 n − 1 − C n n = 2 n − 1 − 1 C_n^0+C_n^2+...+C_n^{n-2}+C_n^n-C_n^n=2^{n-1}-C_n^n=2^{n-1}-1 Cn0+Cn2+...+Cnn−2+Cnn−Cnn=2n−1−Cnn=2n−1−1
在 x i = 1 , y i = 0 x_i=1,y_i=0 xi=1,yi=0的情况下,后面 n − i n-i n−i位可以任意取,个数为 ∑ i = 0 n C n i = 2 n \sum_{i=0}^nC_n^i=2^n ∑i=0nCni=2n,总共 2 n ∗ ( n − i ) 2^n*(n-i) 2n∗(n−i)
前面 i − 1 i-1 i−1位,只需考虑 x = 0 , y = 0 x=0,y=0 x=0,y=0的情况,总共 ( 2 n − 1 − 1 ) ∗ ( i − 1 ) (2^{n-1}-1)*(i-1) (2n−1−1)∗(i−1)
这是因为如果从前往后枚举每一位 x = 1 , y = 0 x=1,y=0 x=1,y=0的情况时,算到后面时 i i i前面存在 x = 1 , y = 0 x=1,y=0 x=1,y=0的情况会被前面算到。
n为奇数时
第 x i x_i xi为1时,说明这 n n n个数的第 i i i为全为1,而 y i y_i yi为则必定为1
若 x i x_i xi为0,则 y i y_i yi为为0的情况为 C n 0 + C n 2 + . . . + C n n − 1 = 2 n − 1 C_n^0+C_n^2+...+C_n^{n-1}=2^{n-1} Cn0+Cn2+...+Cnn−1=2n−1
这一位的总情况为 2 n − 1 + 1 2^{n-1}+1 2n−1+1
所以每一位 x i = y i x_i=y_i xi=yi才满足条件,故总情况为 ( 2 n − 1 + 1 ) ∗ k (2^{n-1}+1)*k (2n−1+1)∗k
#include <iostream>
#include <algorithm>
#define ll long long
using namespace std;
const int mod=1e9+7;
ll qmi(ll x,ll y)
{
ll res=1;
while(y)
{
if(y&1) res=res*x%mod;
x=x*x%mod;
y>>=1;
}
return res;
}
int main()
{
int T;
cin>>T;
while(T--)
{
int n,k;
cin>>n>>k;
int t=qmi(2,n-1);
ll ans=0;
if(n%2)
{
ans=qmi(t+1,k);
}
else
{
ans=qmi(t-1,k);
for(int i=1;i<=k;i++)
{
ans=(ans+qmi(t-1,i-1)*qmi(t*2,k-i)%mod)%mod;
}
}
cout<<ans<<endl;
}
return 0;
}