Buggy python submission (verdict: Time Limit Exceeded):
import numpy as np

S = list(input().strip())
length = len(S)
op = np.asarray(S)
x = -1
count = 0
for i in op:
    y = -1
    x += 1
    group = ""
    for j in op:
        y += 1
        if x > y:
            continue
        group += j
        if int(group) % 2019 == 0:
            count += 1
print(count)

def checkValue():
    count = 0
    for i in range(length):
        group = ""
        for j in range(i, length):
            group += op[j]
            if int(group) % 2019 == 0:
                count += 1
    print(count)
#checkValue()
    


Fixed submission:
import numpy as np
#S = list(input().strip())
#length = len(S)
#op = np.asarray(S)

def solution():
    S = input()
    N = len(S)
    num = [0] * 2019
    num[0] = 1
    c, ans, dgt = 0, 0, 1
    for i in range(N-1, -1, -1):
        c = (c + int(S[i]) * dgt) % 2019
        dgt *= 10
        dgt %= 2019
        ans += num[c]
        num[c] += 1
        
    print(ans)

solution()



def sample():
    x = -1
    count = 0
    for i in op:
        x += 1
        group = ""
        for j, name in enumerate(op, x):
            group += name
            if int(group) % 2019 == 0:
                count += 1
    print(count)

def checkValue():
    count = 0
    for i in range(length):
        group = ""
        for j in range(i, length):
            group += op[j]
            if int(group) % 2019 == 0:
                count += 1
    print(count)
#checkValue()

Buggy python submission (verdict: Time Limit Exceeded):
import numpy as np

S = list(input().strip())
length = len(S)
op = np.asarray(S)

def checkValue():
    count = 0
    for i in range(length):
        group = ""
        for j in range(i, length):
            group += op[j]
            if int(group) % 2019 == 0:
                count += 1
    print(count)
checkValue()
    


Fixed submission:
import numpy as np
#S = list(input().strip())
#length = len(S)
#op = np.asarray(S)

def solution():
    S = input()
    N = len(S)
    num = [0] * 2019
    num[0] = 1
    c, ans, dgt = 0, 0, 1
    for i in range(N-1, -1, -1):
        c = (c + int(S[i]) * dgt) % 2019
        dgt *= 10
        dgt %= 2019
        ans += num[c]
        num[c] += 1
        
    print(ans)

solution()



def sample():
    x = -1
    count = 0
    for i in op:
        x += 1
        group = ""
        for j, name in enumerate(op, x):
            group += name
            if int(group) % 2019 == 0:
                count += 1
    print(count)

def checkValue():
    count = 0
    for i in range(length):
        group = ""
        for j in range(i, length):
            group += op[j]
            if int(group) % 2019 == 0:
                count += 1
    print(count)
#checkValue()

Buggy python submission (verdict: Time Limit Exceeded):
S = list(input().strip())
length = len(S)

def checkValue():
    count = 0
    for i in range(length):
        group = ""
        for j in range(i, length):
            group += S[j]
            if int(group) % 2019 == 0:
                count += 1
    print(count)
checkValue()
    


Fixed submission:
import numpy as np
#S = list(input().strip())
#length = len(S)
#op = np.asarray(S)

def solution():
    S = input()
    N = len(S)
    num = [0] * 2019
    num[0] = 1
    c, ans, dgt = 0, 0, 1
    for i in range(N-1, -1, -1):
        c = (c + int(S[i]) * dgt) % 2019
        dgt *= 10
        dgt %= 2019
        ans += num[c]
        num[c] += 1
        
    print(ans)

solution()



def sample():
    x = -1
    count = 0
    for i in op:
        x += 1
        group = ""
        for j, name in enumerate(op, x):
            group += name
            if int(group) % 2019 == 0:
                count += 1
    print(count)

def checkValue():
    count = 0
    for i in range(length):
        group = ""
        for j in range(i, length):
            group += op[j]
            if int(group) % 2019 == 0:
                count += 1
    print(count)
#checkValue()

Buggy python submission (verdict: Time Limit Exceeded):
S = list(input().strip())
length = len(S)
check = ""
for i in range(length):
    check += S[i]

def checkValue():
    count = 0
    for i in range(length):
        group = ""
        for j in range(i, length):
            group += S[j]
            if int(group) % 2019 == 0:
                count += 1
    print(count)
checkValue()
    
def dfs(total, i, j, group):
    if (len(group) != 0 and int(group) % 2019 == 0):
        print(i, j, group)
        return 1
    if i > j:
        return 0
    if (i > length-1 or j > length-1):
        return 0
    if len(group) != 0 and int(group) > int(check):
        return 0    
    return dfs(total, i+1, j, group+S[i]) + dfs(total, i, j+1, group+S[j])

#print(dfs(0, 0, 0, ""))


Fixed submission:
import numpy as np
#S = list(input().strip())
#length = len(S)
#op = np.asarray(S)

def solution():
    S = input()
    N = len(S)
    num = [0] * 2019
    num[0] = 1
    c, ans, dgt = 0, 0, 1
    for i in range(N-1, -1, -1):
        c = (c + int(S[i]) * dgt) % 2019
        dgt *= 10
        dgt %= 2019
        ans += num[c]
        num[c] += 1
        
    print(ans)

solution()



def sample():
    x = -1
    count = 0
    for i in op:
        x += 1
        group = ""
        for j, name in enumerate(op, x):
            group += name
            if int(group) % 2019 == 0:
                count += 1
    print(count)

def checkValue():
    count = 0
    for i in range(length):
        group = ""
        for j in range(i, length):
            group += op[j]
            if int(group) % 2019 == 0:
                count += 1
    print(count)
#checkValue()