Problem:
Score : 300 points

Problem Statement

Given any integer x, Aoki can do the operation below.

Operation: Replace x with the absolute difference of x and K.

You are given the initial value of an integer N. Find the minimum possible value taken by N after Aoki does the operation zero or more times.

Constraints

0 ≤ N ≤ 10^{18}

1 ≤ K ≤ 10^{18}

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N K

Output

Print the minimum possible value taken by N after Aoki does the operation zero or more times.

Sample Input 1

7 4

Sample Output 1

1

Initially, N=7.

After one operation, N becomes |7-4| = 3.

After two operations, N becomes |3-4| = 1, which is the minimum value taken by N.

Sample Input 2

2 6

Sample Output 2

2

N=2 after zero operations is the minimum.

Sample Input 3

1000000000000000000 1

Sample Output 3

0

Solution in Go (1.6) (judge verdict: Wrong Answer)

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

const (
	maxBufsize = 1000000
)

func inputs(lines int) []string {
	var strSlice []string

	rdr := bufio.NewReaderSize(os.Stdin, maxBufsize)

	for i := 0; i < lines; i++ {

		line := ReadLine(rdr)
		strSlice = append(strSlice, line)

	}

	return strSlice
}

// ReadLine is to read long line
func ReadLine(rdr *bufio.Reader) string {
	buf := make([]byte, 0, maxBufsize)
	for {
		l, p, e := rdr.ReadLine()

		if e != nil {
			panic(e)
		}
		buf = append(buf, l...)
		if !p {
			break
		}
	}

	return string(buf)
}

func main() {
	line1 := inputs(1)

	lineSlice := strings.Split(line1[0], " ")

	n, _ := strconv.Atoi(lineSlice[0])

	k, _ := strconv.Atoi(lineSlice[1])

	result := n / k
	amari := n % k

	if result == 0 {
		if 1 <= k {
			if (k - n) < result {
				fmt.Println(k - n)
			} else {
				fmt.Println(result)
			}
			return
		} else {
			fmt.Println(result)
		}
		return
	}

	if (result + 1) <= n {
		//if math.Abs(float64((result+1)*k-n)) < float64(amari) {
		if ((result+1)*k - n) < amari {
			fmt.Printf("%d\n", (result+1)*k-n)
		} else {
			fmt.Printf("%d\n", amari)
		}

	} else {
		fmt.Printf("%d\n", amari)
	}
	return
}