<p>Given an integer array <code>nums</code>, return <em>the sum of divisors of the integers in that array that have exactly four divisors</em>. If there is no such integer in the array, return <code>0</code>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> nums = [21,4,7]
<strong>Output:</strong> 32
<strong>Explanation:</strong> 
21 has 4 divisors: 1, 3, 7, 21
4 has 3 divisors: 1, 2, 4
7 has 2 divisors: 1, 7
The answer is the sum of divisors of 21 only.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> nums = [21,21]
<strong>Output:</strong> 64
</pre>

<p><strong class="example">Example 3:</strong></p>

<pre>
<strong>Input:</strong> nums = [1,2,3,4,5]
<strong>Output:</strong> 0
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= nums.length &lt;= 10<sup>4</sup></code></li>
	<li><code>1 &lt;= nums[i] &lt;= 10<sup>5</sup></code></li>
</ul>

class Solution {
public:
    int sumFourDivisors(vector<int> &nums)
    {
        int primes[66] = {   2,   3,   5,   7,  11,  13,  17,  19,  23,
                            29,  31,  37,  41,  43,  47,  53,  59,  61,
                            67,  71,  73,  79,  83,  89,  97, 101, 103,
                           107, 109, 113, 127, 131, 137, 139, 149, 151,
                           157, 163, 167, 173, 179, 181, 191, 193, 197,
                           199, 211, 223, 227, 229, 233, 239, 241, 251,
                           257, 263, 269, 271, 277, 281, 283, 293, 307,
                           311, 313, 317 };
        int i, p, *q, r, s;

        r = 0;
        for (i = 0; i < nums.size(); i++)
            if (nums[i] > 4) {
                s = (int)std::sqrt(nums[i]);
                q = std::lower_bound(&primes[0], &primes[66], s);
                if (*q * *q != nums[i]) {
                    if (*q > s)
                        q--;
                    p = -1;
                    do {
                        if ((nums[i] % *q) == 0) {
                            if (p != -1) {
                                p = -2;
                                break;
                            }
                            p = *q;
                        }
                        if (q == &primes[0])
                            break;
                        q--;
                    } while (true);
                    if (p > 0 && (p * p > s || (nums[i] % (p * p)) != 0))
                        r += 1 + p + nums[i] / p + nums[i];
                }
            }

        return r;
    }
};
15200