leetcode1969--数组元素的最小非零乘积

2024-03-20 18:20

本文主要是介绍leetcode1969--数组元素的最小非零乘积,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 题意

给定一个非零的二进制位排列;

允许交换其中两个数的二进制位任意次。

求交换后得到数组的最小非零乘积。

如:

p = 3 a = [ 001 010 011 100 101 110 111 ] p=3\\ a=[001\ 010\ 011\ 100\ 101\ 110\ 111]\\ p=3a=[001 010 011 100 101 110 111]
010101交换位置得到110001
011100交换位置得到110001
得到答案
1x7x1x6x1x6=1512

2. 题解

首先题目中的数组一定是在 [ 1 , 2 p − 1 ] [1,2^{p}-1] [1,2p1]之间;

交换二进制位意味着什么呢?

其实就是将

x + y → x ′ + y ′ x + y = x ′ + y ′ x+y \rightarrow x'+y'\\ x+y=x'+y' x+yx+yx+y=x+y

由于求得的是最小的非0乘积,所以我们最少要保留最低位为1

对于两个数交换后乘积最大实际上是求
m i n ( x y ) , s . t . x + y = k min(xy),s.t. x+y=k min(xy),s.t.x+y=k
所以我们需要尽量将两个数的差值变大。

所以我们分解的形式应为:
a & b = 0 a ⊕ b = 2 p − 1 a\&b=0\\ a \oplus b=2^p-1 a&b=0ab=2p1

所以对于数组 [ 1 , . . . , 2 p − 1 ] [1,...,2^p-1] [1,...,2p1]的乘积为

1 × ( 2 p − 1 ) × ( 2 p − 2 ) 2 p − 1 − 1 1 \times(2^p-1) \times (2^p-2)^{2^{p-1}-1} 1×(2p1)×(2p2)2p11

由于 2 2 p − 1 − 1 2^{2^p-1}-1 22p11很大,所以需要使用快速幂。

  • 代码
class Solution {
public:long long fast_pow(long long a,unsigned long long b) {long long MOD = 1e9+7;long long base = a%MOD;long long ans = 1;while (b) {if (b & 1) ans = ans * base % MOD; b >>= 1;if (b)base = base  * base % MOD;}return ans % MOD ;}int minNonZeroProduct(int p) {long long ans = ((unsigned long long)1 << p) - 1;
int MOD = 1e9+7;long long base = ans - 1;long long  cnt = ((unsigned long long)1 << (p -1)) - 1;// std::cout << "base:" << base << " cnt: " << cnt << std::endl; ans = ans%MOD * fast_pow(base, cnt) %MOD;return ans % MOD;}
};

这篇关于leetcode1969--数组元素的最小非零乘积的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/830353

相关文章

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于

把Python列表中的元素移动到开头的三种方法

《把Python列表中的元素移动到开头的三种方法》在Python编程中,我们经常需要对列表(list)进行操作,有时,我们希望将列表中的某个元素移动到最前面,使其成为第一项,本文给大家介绍了把Pyth... 目录一、查找删除插入法1. 找到元素的索引2. 移除元素3. 插入到列表开头二、使用列表切片(Lis

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

CSS实现元素撑满剩余空间的五种方法

《CSS实现元素撑满剩余空间的五种方法》在日常开发中,我们经常需要让某个元素占据容器的剩余空间,本文将介绍5种不同的方法来实现这个需求,并分析各种方法的优缺点,感兴趣的朋友一起看看吧... css实现元素撑满剩余空间的5种方法 在日常开发中,我们经常需要让某个元素占据容器的剩余空间。这是一个常见的布局需求

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA