Extreme Extension (Codeforces 1603C)
Tags: Math, number theory

For an array $$$b$$$ of $$$n$$$ integers, the extreme value of this array is the minimum number of times (possibly, zero) the following operation has to be performed to make $$$b$$$ non-decreasing:   Select an index $$$i$$$ such that $$$1 \le i \le |b|$$$, where $$$|b|$$$ is the current length of $$$b$$$.  Replace $$$b_i$$$ with two elements $$$x$$$ and $$$y$$$ such that $$$x$$$ and $$$y$$$ both are positive integers and $$$x + y = b_i$$$.  This way, the array $$$b$$$ changes and the next operation is performed on this modified array. For example, if $$$b = [2, 4, 3]$$$ and index $$$2$$$ gets selected, then the possible arrays after this operation are $$$[2, \underline{1}, \underline{3}, 3]$$$, $$$[2, \underline{2}, \underline{2}, 3]$$$, or $$$[2, \underline{3}, \underline{1}, 3]$$$. And consequently, for this array, this single operation is enough to make it non-decreasing: $$$[2, 4, 3] \rightarrow [2, \underline{2}, \underline{2}, 3]$$$.It's easy to see that every array of positive integers can be made non-decreasing this way.YouKn0wWho has an array $$$a$$$ of $$$n$$$ integers. Help him find the sum of extreme values of all nonempty subarrays of $$$a$$$ modulo $$$998\,244\,353$$$. If a subarray appears in $$$a$$$ multiple times, its extreme value should be counted the number of times it appears.An array $$$d$$$ is a subarray of an array $$$c$$$ if $$$d$$$ can be obtained from $$$c$$$ by deletion of several (possibly, zero or all) elements from the beginning and several (possibly, zero or all) elements from the end.

Input: The first line contains a single integer $$$t$$$ ($$$1 \le t \le 10\,000$$$) — the number of test cases.The first line of each test case contains a single integer $$$n$$$ ($$$1 \le n \le 10^5$$$).The second line of each test case contains $$$n$$$ integers $$$a_1, a_2, \ldots, a_n$$$ ($$$1 \le a_i \le 10^5$$$).It is guaranteed that the sum of $$$n$$$ over all test cases doesn't exceed $$$10^5$$$.

Output: For each test case, print a single integer  — the sum of extreme values of all subarrays of $$$a$$$ modulo $$$998\,244\,353$$$.

Note: Let $$$f(l, r)$$$ denote the extreme value of $$$[a_l, a_{l+1}, \ldots, a_r]$$$.In the first test case,   $$$f(1, 3) = 3$$$, because YouKn0wWho can perform the following operations on the subarray $$$[5, 4, 3]$$$ (the newly inserted elements are underlined):$$$[5, 4, 3] \rightarrow [\underline{3}, \underline{2}, 4, 3] \rightarrow [3, 2, \underline{2}, \underline{2}, 3] \rightarrow [\underline{1}, \underline{2}, 2, 2, 2, 3]$$$; $$$f(1, 2) = 1$$$, because $$$[5, 4] \rightarrow [\underline{2}, \underline{3}, 4]$$$; $$$f(2, 3) = 1$$$, because $$$[4, 3] \rightarrow [\underline{1}, \underline{3}, 3]$$$; $$$f(1, 1) = f(2, 2) = f(3, 3) = 0$$$, because they are already non-decreasing. So the total sum of extreme values of all subarrays of $$$a = 3 + 1 + 1 + 0 + 0 + 0 = 5$$$.

Sample Inputs:
4
3
5 4 3
4
3 2 1 4
1
69
8
7264 40515 28226 92776 35285 21709 75124 48163

Sample Outputs:
5
9
0
117

Solution (Python):
import sys
M = 998244353
(d, nd) = ([-1] * 100002, [-1] * 100002)
for _ in range(int(sys.stdin.readline())):
    n = int(sys.stdin.readline())
    a = [int(_) for _ in sys.stdin.readline().split()]
    v = []
    r = 0
    for i in range(n - 1, -1, -1):
        nd[a[i]] = 1
        nv = [a[i]]
        for j in v:
            nn = (a[i] + j - 1) // j
            x = a[i] // nn
            if nd[x] == -1:
                nd[x] = d[j]
                nv.append(x)
            else:
                nd[x] += d[j]
            r += (nn - 1) * (i + 1) * d[j]
            r %= M
        (d, nd) = (nd, d)
        for i in v:
            nd[i] = -1
        v = nv
    print(r)
    for i in v:
        d[i] = -1

Solution (Python):
import sys
M = 998244353
(d, nd) = ([-1] * 100002, [-1] * 100002)
for _ in range(int(sys.stdin.readline())):
    n = int(sys.stdin.readline())
    a = [int(_) for _ in sys.stdin.readline().split()]
    v = []
    r = 0
    for i in range(n - 1, -1, -1):
        nd[a[i]] = 1
        nv = [a[i]]
        for j in v:
            nn = (a[i] + j - 1) // j
            x = a[i] // nn
            if nd[x] == -1:
                nd[x] = d[j]
                nv.append(x)
            else:
                nd[x] += d[j]
            r += (nn - 1) * (i + 1) * d[j]
            r %= M
        (d, nd) = (nd, d)
        for i in v:
            nd[i] = -1
        v = nv
    print(r)
    for i in v:
        d[i] = -1

Solution (Python):
import sys
input = lambda : sys.stdin.readline().rstrip('\n')
MOD = 998244353
MAXN = 10 ** 5
MAX = MAXN * (MAXN - 1) // 2 + 10

def ceildiv(a: int, b: int) -> int:
    return (a + b - 1) // b

def brute(N, A):

    def f(A):
        lim = MAX
        r = 0
        for v in reversed(A):
            t = ceildiv(v, lim)
            r += t - 1
            lim = v // t
        return r
    res = 0
    for i in range(N):
        for j in range(i + 1, N + 1):
            x = f(A[i:j])
            res = (res + x) % MOD
    return res

def nsquared(N, A):
    r = 0
    for i in range(N):
        lim = MAX
        for j in range(i, -1, -1):
            v = A[j]
            t = ceildiv(v, lim)
            r += (j + 1) * (t - 1)
            lim = v // t
    return r
O = []
for _ in range(int(input())):
    N = int(input())
    A = list(map(int, input().split()))
    r = 0
    DP = []
    for i in range(N - 1, -1, -1):
        v = A[i]
        NDP = []

        def proc(lim, c):
            global r
            t = ceildiv(v, lim)
            r = (r + (i + 1) * (t - 1) % MOD * c) % MOD
            lim = v // t
            NDP.append(lim * MAX + c)
        DP.sort()
        llim = cnt = 0
        for x in DP:
            (lim, c) = divmod(x, MAX)
            if lim != llim:
                if cnt:
                    proc(llim, cnt)
                cnt = 0
            llim = lim
            cnt += c
        if cnt:
            proc(llim, cnt)
        NDP.append(v * MAX + 1)
        DP = NDP
    O.append(r)
print('\n'.join(map(str, O)))