<script>
let maxn = 10005;
let INF = 999999;
let smallest_prime =
new
Array(maxn);
for
(let i=0;i<maxn;i++)
{
smallest_prime[i]=0;
}
let divisors =
new
Array(maxn);
for
(let i=0;i<maxn;i++)
{
divisors[i]=0;
}
let segmentTree =
new
Array(4 * maxn);
for
(let i=0;i<4*maxn;i++)
{
segmentTree[i]=0;
}
function
findSmallestPrimeFactors()
{
for
(let i = 0 ; i < maxn ; i ++ )
smallest_prime[i] = INF;
for
(let i = 2; i < maxn; i++)
{
if
(smallest_prime[i] == INF)
{
smallest_prime[i] = i;
for
(let j = i * i; j < maxn; j += i)
{
if
(smallest_prime[j] > i)
smallest_prime[j] = i;
}
}
}
}
function
buildDivisorsArray()
{
for
(let i = 1; i < maxn; i++)
{
divisors[i] = 1;
let n = i;
let p = smallest_prime[i]
let k = 0;
while
(n > 1)
{
n = Math.floor(n / p);
k++;
if
(smallest_prime[n] != p)
{
divisors[i] = divisors[i] * (k + 1);
k = 0;
}
p = smallest_prime[n];
}
}
}
function
buildSegtmentTree(node,a,b)
{
if
(a == b)
{
segmentTree[node] = divisors[a];
return
;
}
buildSegtmentTree(2 * node, a, Math.floor((a + b) / 2));
buildSegtmentTree((2 * node) + 1, Math.floor((a + b) / 2) + 1, b);
segmentTree[node] = Math.max(segmentTree[2 * node],
segmentTree[(2 *node) + 1]);
}
function
query(node,a,b,l,r)
{
if
(l > b || a > r)
return
-1;
if
(a >= l && b <= r)
return
segmentTree[node];
return
Math.max(query(2 * node, a,
Math.floor((a + b) / 2), l, r),
query(2 * node + 1,
Math.floor((a + b) / 2) + 1, b, l, r));
}
findSmallestPrimeFactors();
buildDivisorsArray();
buildSegtmentTree(1, 1, maxn - 1);
document.write(
"Maximum divisors that a number "
+
"has in [1, 100] are "
+ query(1, 1, maxn - 1, 1, 100)+
"<br>"
);
document.write(
"Maximum divisors that a number "
+
"has in [10, 48] are "
+
query(1, 1, maxn - 1, 10, 48)+
"<br>"
);
document.write(
"Maximum divisors that a number "
+
"has in [1, 10] are "
+
query(1, 1, maxn - 1, 1, 10)+
"<br>"
);
</script>