因子和
对num分解质因子以后有
那么他的因子其实就是几个n1,几个n2,几个n3…的乘积(每一个因子选几个,也可以不选)。因为num的因子分解质因子的到的因子一定包含在num分解质因子的结果中。所以就会有因子和的一种算法
然后乘积的每一项如何计算呢?我们可以利用秦九韶算法
(就是每一次计算都把n1作为公因子提出来)
或者说我们也可以利用等比数列求和公式 s = n i p i + 1 − 1 n i − 1 s=\frac{ni^{pi+1}-1}{ni-1} s=ni−1nipi+1−1
力扣1390. 四因数
暴力
class Solution {
public:
int sumFourDivisors(vector<int>& nums) {
int res=0;
for(auto t:nums){
vector<int>cnt;
int j=t;
for(int i=1;i<=j/i;i++){
if(j%i==0){
cnt.push_back(i);
if(j/i!=i) cnt.push_back(j/i);
}
if(cnt.size()>4) break;
}
if(cnt.size()==4){
for(auto g:cnt) res+=g;
}
}
return res;
}
};
公式法
因子数:
将一个整数n分解质因数以后能得到
n
=
n
1
p
1
+
n
2
p
2
+
n
3
p
3
+
.
.
.
n=n1^{p1}+n2^{p2}+n3^{p3}+...
n=n1p1+n2p2+n3p3+...然后我们来看他的因子长什么样。他的因子分解质因子得到的质因子一定包含在n中(他是由n分出来的嘛)所以我们就有因子数就是n中每一个质因子取x个乘起来得到的。nk一共可以取0-pk个。所以就有
s
u
m
=
(
1
+
p
1
)
+
(
1
+
p
2
)
+
(
1
+
p
3
)
+
.
.
.
sum=(1+p1)+(1+p2)+(1+p3)+...
sum=(1+p1)+(1+p2)+(1+p3)+...
class Solution {
int cnt(int n) {
int res = 1;
for (int i = 2; i <= n / i; i++) {
if (n % i == 0) {
int a = 0;
while (n % i == 0) {
n /= i;
a++;
}
res = res * (a + 1);
if(res>4) return res;
}
}
if(n>1) res = res * 2;
return res;
}
int asum(int n) {
if (cnt(n) != 4) return 0;
int res = 1;
for (int i = 2; i <= n / i; i++) {
if (n % i == 0) {
int a = 1;
while (n % i == 0) {
n /= i;
a *= i;
}
res = res * (a * i - 1) / (i - 1);
}
}
if (n > 1) res = res * (1 + n);
return res;
}
public:
int sumFourDivisors(vector<int>& nums)
{
if (nums.size() == 0) return 0;
int sum = 0;
for (auto t : nums) sum += asum(t);
return sum;
}
};