因子下标聚合的扩展
题目描述 给你一个下标从 1 开始、长度为 n 的整数数组 nums。 对于 nums[i],如果 n 能够被 i 整除,也就是 n % i == 0,那么称它为一个特殊元素。 请返回所有特殊元素的平方和。(力扣 2778) 这是一道非常简单的题:枚举下标,判断是否为 n 的因子,是的话就把平方加到答案里。 class Solution { public: int sumOfSquares(vector<int>& nums) { int n = nums.size(); int ans = 0; for (int i = 1; i <= n; ++i) { if (n % i == 0) { ans += nums[i - 1] * nums[i - 1]; } } return ans; } }; 这里最容易出错的地方只有一个:题目下标从 1 开始,而 C++ 数组下标从 0 开始。因此判断用 i,取值用 nums[i - 1]。 这道题其实就三件事 说白了,就是下面三件事: 哪些位置要算? 这些位置怎么算? 数组变不变,要查几次? 原题的答案也很简单: 要算的位置:i 是 n 的因子; 算法:把 nums[i - 1] 的平方加起来; 查询:数组不变,只查一次。 后面说的“扩展”,就是把这三件事分别换一下,看看原来的代码还能不能用。 一、换个条件:不一定只看因子 1. 从“因子”改成“质因子” 比如题目改成:只有当 i 是 n 的质因子时,才把它加进答案。那怎么办?很简单,平方和不用改,只改前面的判断: ...