Problem:
Score : 500 points

Problem Statement

Snuke received a positive integer N from Takahashi.
A positive integer m is called a favorite number when the following condition is satisfied:

The quotient and remainder of N divided by m are equal, that is, \lfloor \frac{N}{m} \rfloor = N \bmod m holds.

Find all favorite numbers and print the sum of those.

Constraints

All values in input are integers.

1 \leq N \leq 10^{12}

Input

Input is given from Standard Input in the following format:

N

Output

Print the answer.

Sample Input 1

8

Sample Output 1

10

There are two favorite numbers: 3 and 7. Print the sum of these, 10.

Sample Input 2

1000000000000

Sample Output 2

2499686339916

Watch out for overflow.

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using static System.Math;
using static System.Console;

namespace D_D2019
{
    class MainClass
    {

        static long[] s;


        public static void Main(string[] args)
        {
            s = Array.ConvertAll(ReadLine().Split().ToArray(), long.Parse);
            long n = s[0];
            long ans = 0;


            var dlst = DivisorList(s[0]);
            dlst.Reverse();
            //dlst.ForEach(WriteLine);
            
            //foreach(long item in dlst)WriteLine(item);

            for(int i = 0;i < dlst.Count-1;i++){
                long div = n/(dlst[i]-1);
                long r = n%(dlst[i]-1);
                if(div>r)break;
                if(dlst[i]-1!=dlst[i+1]&&div==r){
                    ans+=dlst[i]-1;
                    //WriteLine(dlst[i]-1);
                }
            }
            WriteLine(ans);

        }


        public static List<long> DivisorList(long p)
        {
            var res = new List<long>();
            var sqp = (long)Sqrt(p);
            long tmp = 0;

            for(long i= 1;i<=sqp;i++){
                if(p%i==0){
                    res.Add(i);
                    tmp = p/i;
                    if(tmp!=i) res.Add(tmp);
                }
            }
            res.Sort();
            return res;
        }
    }
}