Copy or Prefix Sum (Codeforces 1485F)
Tags: DP, combinatorics

You are given an array of integers $$$b_1, b_2, \ldots, b_n$$$.An array $$$a_1, a_2, \ldots, a_n$$$ of integers is hybrid if for each $$$i$$$ ($$$1 \leq i \leq n$$$) at least one of these conditions is true:   $$$b_i = a_i$$$, or  $$$b_i = \sum_{j=1}^{i} a_j$$$. Find the number of hybrid arrays $$$a_1, a_2, \ldots, a_n$$$. As the result can be very large, you should print the answer modulo $$$10^9 + 7$$$.

Input: The first line contains a single integer $$$t$$$ ($$$1 \le t \le 10^4$$$) — the number of test cases.The first line of each test case contains a single integer $$$n$$$ ($$$1 \le n \le 2 \cdot 10^5$$$).The second line of each test case contains $$$n$$$ integers $$$b_1, b_2, \ldots, b_n$$$ ($$$-10^9 \le b_i \le 10^9$$$).It is guaranteed that the sum of $$$n$$$ for all test cases does not exceed $$$2 \cdot 10^5$$$.

Output: For each test case, print a single integer: the number of hybrid arrays $$$a_1, a_2, \ldots, a_n$$$ modulo $$$10^9 + 7$$$.

Note: In the first test case, the hybrid arrays are $$$[1, -2, 1]$$$, $$$[1, -2, 2]$$$, $$$[1, -1, 1]$$$.In the second test case, the hybrid arrays are $$$[1, 1, 1, 1]$$$, $$$[1, 1, 1, 4]$$$, $$$[1, 1, 3, -1]$$$, $$$[1, 1, 3, 4]$$$, $$$[1, 2, 0, 1]$$$, $$$[1, 2, 0, 4]$$$, $$$[1, 2, 3, -2]$$$, $$$[1, 2, 3, 4]$$$.In the fourth test case, the only hybrid array is $$$[0, 0, 0, 1]$$$.

Sample Inputs:
4
3
1 -1 1
4
1 2 3 4
10
2 -1 1 -2 2 3 -5 0 2 -1
4
0 0 0 1

Sample Outputs:
3
8
223
1

Solution (Python):
for s in [*open(0)][2::2]:
    c = 0
    D = {0: 1}
    S = 1
    for n in map(int, s.split()):
        c += n
        (D[c], S) = (S, (2 * S - D.get(c, 0)) % (10 ** 9 + 7))
    print(D[c])

Solution (Python):
for s in [*open(0)][2::2]:
    C = [0]
    D = {0: 1}
    S = 1
    for n in map(int, s.split()):
        C += (C[-1] + n,)
    for n in C[1:-1]:
        (D[n], S) = (S, (2 * S - D.get(n, 0)) % (10 ** 9 + 7))
    print(S)

Solution (Python):
for s in [*open(0)][2::2]:
    C = [0]
    N = 0
    D = {0: 1}
    S = 1
    for n in map(int, s.split()):
        C += (C[-1] + n,)
        N += 1
    for i in range(1, N):
        (D[C[i]], S) = (S, (2 * S - D.get(C[i], 0)) % (10 ** 9 + 7))
    print(S)