Codeforces Round #737 (Div. 2) C题补题记录
C. Moamen and XOR 题目链接
题目大意 : 给一个大小为 n 的数组 a , 所有ai满足
ai<2^k
求满足
a1&a2&a3&…&an≥a1⊕a2⊕a3⊕…⊕ana1&a2&a3&…&an≥a1⊕a2⊕a3⊕…⊕an.
的a数组数目简记为
x>=y
思路 : 先分奇偶讨论 , 然后按每一位去讨论
n%2==0时
每一位只能出现两种情况
x的第i位为: 1 y的第i位为 0 种类为 1
种
x的第i位为: 0 y的第i位为 0 种类为 C( 0,n ) + C( 2,n ) + C( 4,n ) + … +C( n-2,n ) 种 等于 (2^n-1) - 1
1 , 大于>
情况
当第i位的x>第i位的y ,前i-1位全部相等 , 后面的位可以任意组合
后k-1-i位任意组合每一位的组合个数为2^n , 这k-1-i位的组合方案为(2^n)^( k-1-i )
总方案数为 :( (2^n-1) - 1 )^(i-1) * (2^n)^( k-1-i )
2 , 等于=
的情况
等于只能所有x,y的位都为 0 所以方案数为( (2^n-1) - 1 )^k
综上 :
n为偶时 , 数目为
( (2^n-1) - 1 )^(i-1) * (2^n)^( k-1-i ) + ( (2^n-1) - 1 )^k
n%2!=0时
每一位只能出现两种两种情况 :
x的第i位为: 1 y的第i位为 1 的种类数为 1
种
x的第i位为: 0 y的第i位为 0 的种类数为 C( 0,n ) + C( 2,n ) + C( 4,n ) + … +C( n-1,n ) 种 等于 2^n
即每一位只能相等 , 有k位
综上:
n为奇时 , 数目为
(2^n+1)^k
AC代码
#include<iostream>
#include<queue>
#include<string>
#include<string.h>
#include<algorithm>
#include<cstdio>
#include<map>
#include<set>
#include<stack>
#include<vector>
#include<cmath>
using namespace std;
typedef long long ll;
#define repi(x,y,z) for(int x = y; x<=z;++x)
#define deci(x,y,z) for(int x = y; x>=z;--x)
#define repl(x,y,z) for(ll x = y; x<=z;++x)
#define decl(x,y,z) for(ll x = y; x>=z;--x)
#define gcd(a, b) __gcd(a, b)
#define lcm(a, b) (a * b / gcd(a, b))
#define INF 0x3f3f3f3f
#define CAS int cas;cin>>cas;while(cas--)
#define py puts("Yes")
#define pn puts("No")
#define pcn putchar('\n')
const int maxn=2e5+5;
ll n,k;
ll mo=1e9+7;
inline long long fastpower(ll base,ll power){
ll result=1;
base%=mo;
while(power>0){
if(power & 1){
result=(result*base)%mo;
}
base=(base*base)%mo;
power>>=1;
}
return result%mo;
}
ll ou(){
ll tem=fastpower( (ll)(2) ,(ll) (n-1) ) -1;
ll B=fastpower( tem,k );
ll A=0;
ll item=(tem+1)*2%mo;
repl(i,0,k-1){
A= ( A+ fastpower( tem , i ) * fastpower( item,k-1-i )%mo )%mo;
}
return (A+B)%mo;
}
ll ji(){
ll tem=fastpower( 2, (ll)(n-1) )+1;
ll A = fastpower( tem , k ) % mo;
return A % mo;
}
int main(){
CAS{
cin>>n>>k;
if(k==0){
cout<<1<<endl;continue;
}
if(n%2==0){
cout<<ou()<<endl;
}else{
cout<<ji()<<endl;
}
}
return 0;
}