[Codeforces Round #737 (Div. 2)] C Moamen and XOR (T1 D1

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<<"\n";
	}
	
	return 0;
}
 
posted @ 2021-08-12 01:06  Suki_Sugar  阅读(28)  评论(0编辑  收藏  举报
Live2D