链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
有一个a数组,我们已知他的长度为n,a[+]的和为m,请问如果我们想要a[⊕]的值最大,数组a在满足a[+]=m时有多少种情况
我们定义a[+]指a1+a2....ana_1+a_2....a_na1+a2....an的值
所以a[⊕]指a1a_1a1⊕a2a_2a2⊕a3a_3a3....an....a_n....an的值
其中a数组全部都为非负整数。
答案对1e9+7取模
异或定义(不懂就点这个)
输入描述:
输入两个整数1≤n≤1018,0≤m≤10181\leq n \leq 10^{18},0\leq m \leq 10^{18}1≤n≤1018,0≤m≤1018
输出描述:
输出一个整数表示方案数
输入
3 1
输出
3
思路:可以发现对于异或,所有数的二进制的同一位上只有一个1的时候收益是最大的,如果在同一位上出现了多个1,那么我们消耗的比不上收益,所以就计算总和的m在二进制上有多少个一,然后数组的长度一共有n个,所以对于每一位上的1,有n种情况。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,k;
int cnt;
ll ans;
ll MOD = 1e9 + 7;
int main() {
cin >> n >> k;
ans=1;
n %= MOD;
while(k) {
ans*=n;
ans %= MOD;
k -= k&-k;
}
cout<<ans;
return 0;
}