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 C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Numerics;
using System.Linq;
using static System.Math;

class MainClass
{

    public static void Main(string[] args)
    {
        var _ = LnLngs();
        var N = _[0];var K = _[1];
        var n =N%K;
        Console.WriteLine(Min(n,Abs(n-K)));
    }


    public static long Gcd(long a, long b) { if (a > b) { var r = a % b; if (r == 0) return b; else return Gcd(b, r); } else { var r = b % a; if (r == 0) return a; else return Gcd(a, r); } }
    public static int Gcd(int a, int b){if (a > b){var r = a % b;if (r == 0) return b; else return Gcd(b, r);}else{ var r = b % a; if (r == 0) return a; else return Gcd(a, r); }}
public static int[] LnInts(){var vs = Console.ReadLine().Trim().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);var ins = new int[vs.Length];for (int i = 0; i < vs.Length; i++) ins[i] = int.Parse(vs[i]);return ins;}public static int LnInt(){var vs = Console.ReadLine().Trim();return int.Parse(vs);}public static long[] LnLngs(){var vs = Console.ReadLine().Trim().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);var ins = new long[vs.Length];for (int i = 0; i < vs.Length; i++) ins[i] = long.Parse(vs[i]);return ins;}public static long LnLng(){var vs = Console.ReadLine().Trim();return long.Parse(vs);}public static string[] LnStrs(){var vs = Console.ReadLine().Trim().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);return vs;}public static string LnStr(){var vs = Console.ReadLine().Trim();return vs;}}