一个数的所有除数的除数之和

时间:2019-02-11 10:24:44

标签: c++ algorithm discrete-mathematics number-theory

以下方法的很好解释是here。由于格式问题,我无法在此处编写。

// C ++程序查找所有除数之和      自然数的除数。

#include<bits/stdc++.h> 
using namespace std; 

// Returns sum of divisors of all the divisors 
// of n 
int sumDivisorsOfDivisors(int n) 
{ 
    // Calculating powers of prime factors and 
    // storing them in a map mp[]. 
    map<int, int> mp; 
    for (int j=2; j<=sqrt(n); j++) 
    { 
        int count = 0; 
        while (n%j == 0) 
        { 
            n /= j; 
            count++; 
        } 

        if (count) 
            mp[j] = count; 
    } 

    // If n is a prime number 
    if (n != 1) 
        mp[n] = 1; 

    // For each prime factor, calculating (p^(a+1)-1)/(p-1) 
    // and adding it to answer. 
    int ans = 1; 
    for (auto it : mp) 
    { 
        int pw = 1; 
        int sum = 0; 

        for (int i=it.second+1; i>=1; i--) 
        { 
            sum += (i*pw); 
            pw *= it.first; 
        } 
        ans *= sum; 
    } 

    return ans; 
} 

// Driven Program 
int main() 
{ 
    int n = 10; 
    cout << sumDivisorsOfDivisors(n); 
    return 0; 
} 

我没有得到这个循环中发生的事情,而不是加到ans上,他们正在相加求和,他们是如何计算(p^(a+1)-1)/(p-1)的,这给ans。有人可以帮助我了解这个循环背后的直觉。 >

我从here那里得到了

for (auto it : mp) 
{ 
    int pw = 1; 
    int sum = 0; 

    for (int i=it.second+1; i>=1; i--) 
    { 
        sum += (i*pw); 
        pw *= it.first; 
    } 
    ans *= sum; 
}

1 个答案:

答案 0 :(得分:1)

首先考虑以下语句:

(p 1 0  + p 1 1  +…+ p 1 k 1 )*(p 2 0 + p 2 1 +…+ p 2 k 2

现在,以p为素数的任何p a 的除数为p 0 ,p 1 ,……,p < sup> a ,除数之和为:

(((p 1 0 )+(p 1 0 + p 1 1 )+ .... +(p 1 0 + p 1 1 < / sup> + ... + p k 1 ))*((p 2 0 )+( p 2 0 + p 2 1 )+(p 2 0 + p 2 1 + p 2 2 )+ ...(p 2 0 + p 2 1 + p 2 2 + .. + p 2 k 2 ))

您可以认为上述陈述等同于波纹管陈述:

[[p 1 0 *(k 1 + 1)+ p 1 1 * k 1 + p 1 2 *(k 1 -1)+ ... 。+(p 1 k 1 * 1)]] * [[p 2 0 < / sup> *(k 2 + 1)+ p 2 1 *(k 2 )+ p < sub> 2 2 *(k 2 -1)+ .... +(p 2 k < sub> 2 * 1)]] 在您编写的代码中,最后一条语句已实现。

例如,如果您考虑n = 54 = 3 3 * 2 1
ans的计算格式如下:

ans =(2 0 * 2 + 2 1 * 1)*(3 0 * 4 + 3 1 < / sup> * 3 + 3 2 * 2 + 3 3 * 1)= 4 * 58 = 232