Codeforces Round #737 (Div. 2) Moamen and XOR (T1 D1
思路:
-
n是偶数:
- 相等的情况:考虑每一个数的二进制某一位,只能是与和异或都等于零的情况。对于一位来说有(C_{n}^{0}+C_{n}^{2}+cdots+C_{n}^{n}=2^{n-1})种情况,但(C_{n}^{n})的结果是大于,要减去1,则对于k位来说有((2^{n-1}-1)^{k})种情况。
- 大于的情况: 大于的情况只有某一位全为一,这一位前面取相等的情况,后面位随便取,则枚举k位,对于第i位,结果是((2^{n-1}-1)^{i} * (2^n)^{k-i-1}) 。
-
n是奇数:
- 奇数只有相等的情况,结果为: ((2^{n-1}+1)^k)
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod=1e9+7;
ll qpow(ll a,ll b){
ll ret=1;
while(b){
if(b&1) ret=ret*a%mod;
a=a*a%mod;
b>>=1;
}
return ret;
}
int t;
ll n,k;
int main(){
std::ios::sync_with_stdio(false);
cin>>t;
while(t--){
cin>>n>>k;
ll ans=0;
if(n&1) ans=qpow((qpow(2,n-1)+mod+1)%mod,k);
else{
ans=qpow((qpow(2,n-1)+mod-1)%mod,k);
for(int i=1;i<=k;++i){
ans+=qpow((qpow(2,n-1)+mod-1)%mod,i-1)*qpow(qpow(2,n),k-i)%mod;
ans%=mod;
}
}
cout<<ans%mod<<"
";
}
return 0;
}