5844. 数组元素的最小非零乘积
给你一个正整数 p 。你有一个下标从 1 开始的数组 nums ,这个数组包含范围 [1, 2p - 1] 内所有整数的二进制形式(两端都 包含)。你可以进行以下操作 任意 次:
从 nums 中选择两个元素 x 和 y 。
选择 x 中的一位与 y 对应位置的位交换。对应位置指的是两个整数 相同位置 的二进制位。
比方说,如果 x = 1101 且 y = 0011 ,交换右边数起第 2 位后,我们得到 x = 1111 和 y = 0001 。请你算出进行以上操作 任意次 以后,nums 能得到的 最小非零 乘积。将乘积对 109 + 7 取余 后返回。
注意:答案应为取余 之前 的最小值。
均值,除了全是1那个数,其它是对称的,一半是 1,一半是1补即可。
class Solution {
public:
const static long long Ha=1000000007;
long long ksm(long long x, long long k)
{
long long ret=1;
for (; k; x=x*x%Ha,k>>=1)
if (k&1) ret=ret*x%Ha;
return ret;
}
int minNonZeroProduct(int p) {
long long ret=((1ll<<p)-1)%Ha;
long long tmp=(ret-1+Ha)%Ha;
ret*=ksm(tmp,((1ll<<p)-2)/2);
return ret%Ha;
}
};