2022牛客寒假算法基础集训营2,小沙的数数(贪心,位运算)

传送门

在这里插入图片描述
思路:

由于在二进制拆位最后同位情况下如果存在不止一个一,那么异或之后的贡献一定小于我们的费用,所以我们要保证对于每一位的个数要么是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)+abab,所以 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;
}

猜你喜欢

转载自blog.csdn.net/qq_45550375/article/details/122734664