【最大公约数 唯一分解定理 调和级数】2862. 完全子集的最大元素和

本文涉及知识点

质数、最大公约数、菲蜀定理
组合数学汇总
唯一分解定理 调和级数

LeetCode2862. 完全子集的最大元素和

给你一个下标从 1 开始、由 n 个整数组成的数组。你需要从 nums 选择一个 完全集,其中每对元素下标的乘积都是一个
完全平方数,例如选择 ai 和 aj ,i * j 一定是完全平方数。
返回 完全子集 所能取到的 最大元素和 。
示例 1:
输入:nums = [8,7,3,5,7,2,4,9]
输出:16
解释:我们选择了下标 1 和 4 的元素,并且 1 * 4 是一个完全平方数。
示例 2:
输入:nums = [8,10,3,8,1,13,7,9,4]
输出:20
解释:我们选择了下标 1,4 和 9 的元素。1 * 4,1 * 9,4 * 9 都是完全平方数。

提示:
1 <= n == nums.length <= 104
1 <= nums[i] <= 109

最大公约数

性质一:通过唯一分解定理将x分解为: a1i1a2i2 ⋯ \cdots 。x是完全平方数    ⟺    \iff i1 i2 ⋯ \cdots 全部是偶数。证明:
y=a1i1/2 × \times ×a2i2/2 × ⋯ \times \cdots × ,则y × \times ×y = x。

假定n = nums.size()无限大

某个完全子集的在nums中的下标分别为:{i1,i2 ⋯ \cdots im}
假定其最大公约数为q,则{i1 ÷ \div ÷q,i2 ÷ \div ÷q, ⋯ \cdots } 也是完全子集。
令j1 =i1 ÷ \div ÷q,j2 =i2 ÷ \div ÷q ⋯ \cdots
S={j1,j2 ⋯ \cdots jm} 乘以任意正正数 仍然是完全子集。
性质二此时S中的元素全部是平方数。由于任意两个元素x1,x2互质,故他们没有公因数。x1 × \times ×x2的任意公因数y 要么全部出现在x1,要么全部出现在x2,不失一般性,假定出现在x1中。由于x1 × \times ×x2是完全平方数,故y1出现的次数是偶数。即在x1中出现偶数次,在x2中出现0次,0次也是偶数次。
性质三:如果S的最大值是jm,则S包括[1,jm]任然是完全子集。
结论:任意完全子集的下标一定是:{x,4x,9x,16x ⋯ \cdots }

枚举完全子集小标的最大公约数

核心代码

class Solution {
public:
	long long maximumSum(vector<int>& nums) {
		m_c = nums.size();
		long long llRet = 0;
		for (int q = 1; q <= m_c; q++) {
			long long llSum = 0;
			for (long long i = 1; i * i * q <= m_c; i++) {
				llSum += nums[i * i * q - 1];
			}
			llRet = max(llRet, llSum);
		}
		return llRet;
	}
	int m_c;
};

测试用例

template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{
	if (v1.size() != v2.size())
	{
		assert(false);
		return;
	}
	for (int i = 0; i < v1.size(); i++)
	{
		assert(v1[i] == v2[i]);
	}
}

template<class T>
void Assert(const T& t1, const T& t2)
{
	assert(t1 == t2);
}

int main()
{
	vector<int> nums;
	{
		Solution slu;
		nums = { 8,7,3,5,7,2,4,9 };
		auto res = slu.maximumSum(nums);
		Assert(16LL, res);
	}
	{
		Solution slu;
		nums = { 8,10,3,8,1,13,7,9,4 };
		auto res = slu.maximumSum(nums);
		Assert(20LL, res);
	}
}

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

最近更新

  1. TCP协议是安全的吗?

    2024-05-10 10:16:09       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-10 10:16:09       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-10 10:16:09       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-10 10:16:09       20 阅读

热门阅读

  1. GIT SSL certificate problem

    2024-05-10 10:16:09       14 阅读
  2. C#中的引用参数

    2024-05-10 10:16:09       14 阅读
  3. React开发环境搭建教程

    2024-05-10 10:16:09       10 阅读
  4. 将前端json字符串转换成htmlGET字符串

    2024-05-10 10:16:09       12 阅读
  5. CSS:min-width作用

    2024-05-10 10:16:09       10 阅读
  6. 自然语言处理-文本清理技术

    2024-05-10 10:16:09       10 阅读
  7. Blazor/Hybird 触屏下单程序调优笔记

    2024-05-10 10:16:09       13 阅读
  8. 组合总和 - LeetCode 热题 58

    2024-05-10 10:16:09       11 阅读