#include <stdio.h>
#include <stdlib.h>

int
sum_of_divisors (int n)
{
    int sum = 1;
    
    for (int i = 2; i <= n - 1; i++) {
        if (n % i == 0) {
            sum += i;
        }
    }
    return sum;
}

long long SumOfDivisors_Fast(long long num) {
    long long n = num;
    long long total = 1;

    for (int i = 2; (long long)i * i <= num; i++) {
        if (num % i == 0) {
            int e = 0;
            do {
                e++;
                num /= i;
            } while (num % i == 0);

            long long sum = 0, pow = 1;
            do {
                sum += pow;
                pow *= i;
            } while (e-- > 0);
            total *= sum;
        }
    }
    if (num > 1) {
        total *= (1 + num);
    }
    return total - n;
}

int
main (int argc, char *argv[])
{
    if (argc < 2) {
        fprintf (stderr, "%s: ERROR, need at least one number "
                 "as a command line argument\n", argv[0]);
        exit (1);
    }

    for (int i = 1; i < argc; i++) {
        int n = atoi (argv[i]);
        int curr = -1;
        int steps = 0;
        printf ("Start: %d\n", n);

        while (1) {
            curr = SumOfDivisors_Fast (n);
            printf ("%d\n", curr);
            if (n == curr) {
                break;
            }
            n  = curr;
            steps ++;
        }
        
        printf ("Steps: %d\n", steps);
    }
}
