第 254 场周赛 数组元素的最小非零乘积

大数真的太太太容易出错了

其实就是有2^p - 1个数, 每一位上1的个数有2^(p - 1)个, 最小乘积就是 (2^(p - 1)  - 1)个(2^p - 2)相乘 再乘以一个(2^p - 1)

特别是 long p = (1 << 32);  ❌    正确的写法应该是 long p = ((long)1 << 32);✅ 因为1默认是int类型

class Solution {
public:
    const int mm = 1000000007;
    long fast(long x, long p){
        if(p == 0) return 1;
        if(p == 1) return x;
        long t = fast(x, p / 2);
        if(p % 2 == 0){
            return t * t % mm;
        }
        return t * t % mm * x % mm;
    }
    int minNonZeroProduct(int p) {
        //总共p位, 每位上有p个1
        //分成2^p - 1个数,每位加起来有p个1
        //快速幂
        long t = ((long)1 << (p - 1));
        long x = ((long)1 << p) - 2;
        long k = fast(x % mm, t - 1);
        return k * ((((long)1 << p) - 1) % mm) %mm ;
    }
};
原文地址:https://www.cnblogs.com/Dancing-Fairy/p/15143058.html