其他分享
首页 > 其他分享> > C. Moamen and XOR[Codeforces Round #737 (Div. 2)]

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

作者:互联网

题目传送门

题意:

求n个小于2^k的数

a1&a2&a3&…&an≥a1⊕a2⊕a3⊕…⊕an

的数量

分析:

首先玩一下小样例,考虑第i位

如果有奇数个a,那么如果第i位1的个数是奇数且至少有一个0,会让结果小于,否则一定等于。那第i位就有 (2^n- (2^n-1) ) 种可能取的情况。

如果有偶数个a,那么只有第i位全为1才会使结果大于,只有有偶数个1偶数个0才会使结果等于。那么大于的话,直接加上后面乱组的情况,等于的话,去递归下一位。

code:

#include<bits/stdc++.h>
using namespace std;

long long pw[200001]={1},n,k,P=1000000007;

int qpow(int x, int y){
    long long re=1;
    while(y) {
        if(y&1) re=1LL*re*x%P;
        x=1LL*x*x%P, y>>=1;
    }
    return re;
}
 
int solve(int x){
    if(!x) return 1;
    if(n&1) return 1LL*(pw[n-1]+1)*solve(x-1)%P;
    return (qpow(pw[n], x-1)+1LL*(pw[n-1]-1)*solve(x-1))%P;
}
 
int main(){
    int T; cin>>T;
    for(int i=1; i<=200000; ++i)
        pw[i]=1LL*pw[i-1]*2%P;  
    while(T--) {
        cin>>n>>k;
        printf("%d\n", solve(k));
    }
    return 0;
}

标签:return,pw,int,Moamen,long,Codeforces,1LL,solve,XOR
来源: https://www.cnblogs.com/GUOGaby/p/15123451.html