Problem:
Division of Big Integers

Given two integers $A$ and $B$, compute the quotient, $\frac{A}{B}$. Round down to the nearest decimal.

Input

Two integers $A$ and $B$ separated by a space character are given in a line.

Output

Print the quotient in a line.

Constraints

$-1 \times 10^{1000} \leq A, B \leq 10^{1000}$

$B \ne 0$

Sample Input 1

5 8

Sample Output 1

0

Sample Input 2

100 25

Sample Output 2

4

Sample Input 3

-1 3

Sample Output 3

0

Sample Input 4

12 -3

Sample Output 4

-4

Solution in C# (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace ConsoleApp1
{
    class Program
    {
        static string[] DivReminderBig(string s, string t)
        {
            if (t[0] == '0') return null;

            string sign = "";
            if ((s[0] == '-' && t[0] != '-') || (s[0] != '-' && t[0] == '-')) sign = "-";

            int[] a = StringToPlusInt(s);
            int[] b = StringToPlusInt(t);
            int a_len = (s[0] != '-' ? s.Length : s.Length - 1);
            int b_len = (t[0] != '-' ? t.Length : t.Length - 1);

            int[] div = new int[a_len];
            int n = 0;

            for (int i = b_len - 1; i < a_len && Cmp(s, t) >= 0; i++) //1のカーソル(積が決定する場所)
            {
                int start = i - b_len + 1; //sの開始index

                if (start - 1 >= 0 && a[start - 1] != 0)
                {
                    start -= 1;
                }

                int k = ReplaceNumberDvided(a, b, start, i + 1);
                if (n > 0 || k > 0) div[n++] = k;
            }
            string ret_div = "0";
            string ret_rem = IntArrayToString(a);
            if (n > 0) ret_div = sign + String.Join("", div.Take(n));

            return new string[] { ret_div, ret_rem };
        }

        //aのstart～endの位置の位置までの連続整数に対し、bがa[start:end] end含まない >= b*kを満たす最大のkを求め、それを引いた結果を返す。
        static int ReplaceNumberDvided(int[] a, int[] b, int start, int end)
        {
            int k = 0; //割る数
            int[] sum = new int[end - start];
            int[] a_p = a.Skip(start).Take(end - start).ToArray();

            while (true)
            {
                if (CmpInt(a_p, b) < 0)
                {
                    for (int i = 0; i < end - start; i++)
                    {
                        a[i + start] = a_p[i];
                    }
                    return k;
                }
                int[] result = new int[end - start];
                Minus(a_p, b, result);
                a_p = result;
                k++;
            }


        }

        //乗算
        static string MultBig(string s, string t)
        {
            if (s == "0" || t == "0") return "0";

            string sign = "";
            if ((s[0] == '-' && t[0] != '-') || (s[0] != '-' && t[0] == '-'))
            {
                sign = "-";
            }

            int[] a = StringToPlusInt(s);
            int[] b = StringToPlusInt(t);
            int a_len = (s[0] != '-' ? s.Length : s.Length - 1);
            int b_len = (t[0] != '-' ? t.Length : t.Length - 1);

            int size = a_len + b_len + 1;
            int[] sum = new int[size];

            for (int i = b_len - 1; i >= 0; i--)
            {
                int[] temp = new int[size];
                if (b[i] == 0) continue;
                for (int j = a_len - 1; j >= 0; j--)
                {
                    int v = b[i] * a[j] + temp[i + j + 2];
                    temp[i + j + 1] += v / 10;
                    temp[i + j + 2] = v % 10;
                }
                int[] _sum = new int[size];
                Plus(sum, temp, _sum);
                sum = _sum;
            }
            return sign + IntArrayToString(sum);
        }
        //減算
        static string DifBig(string s, string t)
        {
            if (t[0] == '-') return AddBig(s, t.Substring(1));
            else return AddBig(s, "-" + t);
        }
        //加算
        static string AddBig(string s, string t)
        {
            int[] a = StringToPlusInt(s);
            int[] b = StringToPlusInt(t);
            int a_len = (s[0] != '-' ? s.Length : s.Length - 1);
            int b_len = (t[0] != '-' ? t.Length : t.Length - 1);

            int[] sum = new int[Math.Max(a_len, b_len) + 1];

            if (s[0] != '-' && t[0] != '-')
            {
                Plus(a, b, sum);
                return IntArrayToString(sum);
            }

            if (s[0] == '-' && t[0] == '-')
            {
                Plus(a, b, sum);
                return "-" + IntArrayToString(sum);
            }

            if (s[0] == '-') //常にaが正、bが負で考える。
            {
                int[] temp = b; b = a; a = temp;
                string temp_ = t; t = s; s = temp_; //Cmpでは文字列の方で比較するのでこちらもswap 
            }

            int[] larger = a;
            int[] smaller = b;
            string sign = "";
            if (Cmp(s, t) < 0)
            {
                larger = smaller;
                smaller = a;
                sign = "-";
            }

            Minus(larger, smaller, sum);

            return sign + IntArrayToString(sum);
        }
        //符号なし数字文字列において、数値としてsのほうがtよりなら1 同じなら0 小さいなら -1
        static int Cmp(string s, string t)
        {
            if (s[0] == '-') s = s.Substring(1);
            if (t[0] == '-') t = t.Substring(1);
            if (s == t) return 0;
            if (s.Length > t.Length) return 1;
            if (s.Length < t.Length) return -1;
            for (int i = 0; i < s.Length; i++)
            {
                if (s[i] > t[i]) return 1;
                else if (s[i] < t[i]) return -1;
            }

            return -9999999; //エラー
        }

        static int CmpInt(int[] a, int[] b)
        {
            if (a.Length < b.Length) return -1;
            int start = a.Length - b.Length;
            if (start - 1 >= 0 && a[start - 1] > 0) return 1;

            for (int i = 0; i < b.Length; i++) //全桁一致する(途中終了しない)ようなときはaとbの長さは等しいから大丈夫
            {
                if (a[i + start] > b[i]) return 1;
                else if (a[i + start] < b[i]) return -1;
            }

            return 0;
        }

        //どちらも正のときの加算 結果をsumに。sumは0で初期化されている必要がある。
        //右詰め sum[0]は0であることがありえる。
        static void Plus(int[] a, int[] b, int[] sum)
        {
            int i = a.Length - 1;
            int j = b.Length - 1;
            int k = sum.Length - 1;
            while (i >= 0 || j >= 0)
            {
                int v = 0;
                int w = 0;
                if (i >= 0) v = a[i];
                if (j >= 0) w = b[j];
                int x = v + w + sum[k];
                if (x >= 10)
                {
                    sum[k - 1] += 1;
                    x %= 10;
                }

                sum[k] = x;
                i--;
                j--;
                k--;
            }
        }

        //正の大きい方の数から正の小さい方を減算 dは割り算時のlargerにおける引かれる部分のずらし用
        static void Minus(int[] larger, int[] smaller, int[] sum)
        {
            int i = larger.Length - 1;
            int j = smaller.Length - 1;
            int k = sum.Length - 1;

            while (i >= 0 || j >= 0)
            {
                int v = 0;
                int w = 0;
                if (i >= 0) v = larger[i];
                if (j >= 0) w = smaller[j];
                int x = v - w;
                if (x < 0)
                {
                    x += 10;
                    int csr = i - 1;
                    while (larger[csr] == 0)
                    {
                        larger[csr] = 9;
                        csr--;
                    }
                    larger[csr]--;
                }
                sum[k] = x;
                i--;
                j--;
                k--;
            }
        }

        //符号付き(-のみ)数字文字列をint[]に変換。
        static int[] StringToPlusInt(string s)
        {
            return s.SkipWhile(x => x == '-').Select(y => y - '0').ToArray();
        }

        //int[]をstringに変換。最初の値が0の場合無視
        static string IntArrayToString(int[] array)
        {
            string ret = string.Join("", array.SkipWhile(x => x == 0).Select(y => y.ToString()));
            if (ret == "") ret = "0";
            return ret;
        }

        static void Main(string[] args)
        {
            var st = Console.ReadLine().Split(' ');
            string s = st[0];
            string t = st[1];
            Console.WriteLine(DivReminderBig(s, t)[0]);
        }
    }
}