第 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 ; } };