Decrease the Sum of Digits (Codeforces 1409D)
Tags: Greedy, math

You are given a positive integer $$$n$$$. In one move, you can increase $$$n$$$ by one (i.e. make $$$n := n + 1$$$). Your task is to find the minimum number of moves you need to perform in order to make the sum of digits of $$$n$$$ be less than or equal to $$$s$$$.You have to answer $$$t$$$ independent test cases.

Input: The first line of the input contains one integer $$$t$$$ ($$$1 \le t \le 2 \cdot 10^4$$$) — the number of test cases. Then $$$t$$$ test cases follow.The only line of the test case contains two integers $$$n$$$ and $$$s$$$ ($$$1 \le n \le 10^{18}$$$; $$$1 \le s \le 162$$$).

Output: For each test case, print the answer: the minimum number of moves you need to perform in order to make the sum of digits of $$$n$$$ be less than or equal to $$$s$$$.


Sample Inputs:
5
2 1
1 1
500 4
217871987498122 10
100000000000000001 1

Sample Outputs:
8
0
500
2128012501878
899999999999999999

Solution (Python):
t = int(input())
cases = []

def func(n, s):
    for i in range(len(n)):
        digit = int(n[i])
        if s > digit:
            s -= digit
        elif digit == s:
            if i == len(n) - 1:
                return 0
            elif all([v == '0' for v in n[i + 1:]]):
                return 0
            else:
                left = len(n) - i
                num = 10 ** left
                remaining = n[i:]
                remaining = int(''.join(remaining))
                return num - remaining
        else:
            left = len(n) - i
            num = 10 ** left
            remaining = n[i:]
            remaining = int(''.join(remaining))
            return num - remaining
    return 0
for i in range(t):
    (n, s) = [int(x) for x in input().split(' ')]
    cases.append([n, s])
for k in cases:
    n = k[0]
    s = k[1]
    n = str(n)
    n = list(n)
    print(func(n, s))

Solution (Python):
from sys import stdin, stdout

def next_line():
    return stdin.readline().rstrip()

def next_int():
    return int(next_line())

def out(text):
    stdout.write(str(text) + '\n')

def main():
    amount = next_int()
    for i in range(amount):
        (num, s) = map(lambda x: int(x), next_line().split())
        out(solve(num, s))

def count_digit_sum(num):
    return sum(map(lambda x: int(x), list(str(num))))

def solve(num, s):
    if count_digit_sum(num) <= s:
        return 0
    count = 0
    num_str = str(num)
    n = len(num_str)
    i = -1
    while count < s:
        count += int(num_str[i + 1])
        i += 1
    base = 10 ** (n - i)
    return base - int(num_str[i:])
main()

Solution (Python):
from sys import stdin, stdout

class SOLVE:

    def solve(self):
        R = stdin.readline
        W = stdout.write
        ans = []
        for i in range(int(input())):
            (n, s) = [x for x in R().split()]
            s = int(s)
            if sum([int(x) for x in n]) <= s:
                ans += ['0']
                continue
            temps = 0
            for j in range(len(n)):
                temps += int(n[j])
                if temps >= s:
                    ans += [str(int(str(int('0' + n[:j]) + 1) + (len(n) - j) * '0') - int(n))]
                    break
        W('\n'.join(ans))

def main():
    s = SOLVE()
    s.solve()
main()