leetcode 1969 快速幂进阶

这篇博客探讨了一个寻找数组中非零元素最大乘积的算法问题。关键在于将所有元素变为1或最大值-1,然后进行幂运算。通过快速幂方法计算2的幂次,避免使用可能导致精度损失的`pow`函数。最后,确定幂的指数,即剩余元素平均分配,以获得最大乘积。
摘要由CSDN通过智能技术生成

在这里插入图片描述
此题是很变态的一个题目,咱们考虑所有可能性,其实最好的情况就是把所有的变成1,剩下的变成最大值-1,然后做乘积是最大的。

所以这就是一个求幂的问题,答案为最大值 v a l ∗ ( v a l − 1 ) p val*(val-1)^p val(val1)p,现在就要确定一下这个p到底是多少,其实也很好办,就是减掉1和最大值之后,剩下的平分,即 ( v a l − 2 ) > > 1 (val-2)>>1 (val2)>>1

然后就是求幂的问题了,由于我们要获取最大值,即2的60次方,是不超过long long的,因此可以做,最终求值的时候用快速幂做。
注意:此题是不能用自带的pow函数的,因为用double存,会损失很多精度。

这里,由于快速幂希望一个取余,一个不取余,所以可以用重载来做。

class Solution {
typedef long long ll;
public:
    ll power(ll a, ll n, ll M)
    {
        if(n == 0)return 1;
        ll res = power(a, n/2, M);
        res = res*res%M;
        if(n&1)res = res*a%M;
        return res;
    }

    ll power(ll a, ll n)
    {
        if(n == 0)return 1;
        ll res = power(a, n/2);
        res = res*res;
        if(n&1)res = res*a;
        return res;
    }
    
    int minNonZeroProduct(int p) {
        int MOD = 1e9+7;
        ll p2 = power(2, p-1) - 1;
        ll val = power(2, p) - 1;
        ll ans = val%MOD*power((val-1)%MOD, p2, MOD);
        return ans%MOD;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值