思路:
由于在二进制拆位最后同位情况下如果存在不止一个一,那么异或之后的贡献一定小于我们的费用,所以我们要保证对于每一位的个数要么是0,要么是1,这样的话才能保证 a [ ∧ ] = a [ + ] a\left[\wedge\right] =a\left[ +\right] a[∧]=a[+](因为 a + b = 2 ∗ ( a & b ) + a ∧ b ≥ a ∧ b a+b=2\ast \left( a\& b\right) +a\wedge b\geq a\wedge b a+b=2∗(a&b)+a∧b≥a∧b,所以 a [ ∧ ] = m a\left[\wedge\right] =m a[∧]=m时是最优情况)
随后我们发现对于每一位来说,他们均不相互干扰,那么他们可能产生的情况便都是 n n n种,所以我们只需要求二进制下 m m m有多少个1,随后求 n x n^x nx即可,时间复杂度为 O ( log 2 m ) O\left( \log _{2}m\right) O(log2m)
代码:
#include<iostream>
using namespace std;
const int mod = 1e9+7;
int main(){
long long n, m, ans = 1;
cin >> n >> m;
n %= mod;
while(m){
if(m&1) ans = ans * n % mod;
m >>= 1;
}
cout << ans << endl;
return 0;
}