Problem21

#include <iostream>
#include <vector>
#include <set>
#include <cmath>
using namespace std;

#define NUM 10000

void
aliquot(int n, set<int> *pset_pf)
{
    pset_pf->insert(1);
    if(n == 2)
    {
        return;
    }

    bool *t = new bool [n];
    memset(t, false, n);
    t[1] = true;

    for (int i = 2; i < n; i++)
    {
        if (n%i == 0 && !t[i])
        {
            t[i] = true;
            t[n/i] = true;
        }
        if (t[i])
        {
            pset_pf->insert(i);
            pset_pf->insert(n/i);
        }
    }

    delete [] t;
}

int
pfSum(set<int> *pv_pf)
{
    int sum = 0;
    for (set<int>::iterator it = pv_pf->begin(), end = pv_pf->end(); it != end; it++)
    {
        sum += *it;
    }

    return sum;
}

int
main(int argc, char ** argv)
{
    int ans = 0;

    for (int n = 2; n < NUM; n++)
    {
        set<int> v_pf;
        aliquot(n, &v_pf);

        int sum = pfSum(&v_pf);
        if (n < sum && sum <= NUM)
        {
            set<int> v_tmp;
            aliquot(sum, &v_tmp);
            int tmpSum = pfSum(&v_tmp);

            if (tmpSum == n)
            {
                ans += n + sum;
            }
        }
    }

    cout << ans << endl;

    return 0;
}