description: You are given an integer array a_1, a_2, ..., a_n and integer k.
  
  In one step you can 
  
    * either choose some index i and decrease a_i by one (make a_i = a_i - 1); 
    * or choose two indices i and j and set a_i equal to a_j (make a_i = a_j). 
  
  
  
  What is the minimum number of steps you need to make the sum of array ∑_{i=1}^{n}{a_i} ≤ k? (You are allowed to make values of array negative).
  
  Input
  
  The first line contains a single integer t (1 ≤ t ≤ 10^4) — the number of test cases.
  
  The first line of each test case contains two integers n and k (1 ≤ n ≤ 2 ⋅ 10^5; 1 ≤ k ≤ 10^{15}) — the size of array a and upper bound on its sum.
  
  The second line of each test case contains n integers a_1, a_2, ..., a_n (1 ≤ a_i ≤ 10^9) — the array itself.
  
  It's guaranteed that the sum of n over all test cases doesn't exceed 2 ⋅ 10^5.
  
  Output
  
  For each test case, print one integer — the minimum number of steps to make ∑_{i=1}^{n}{a_i} ≤ k.
  
  Example
  
  Input
  
  
  4
  1 10
  20
  2 69
  6 9
  7 8
  1 2 1 3 1 2 1
  10 1
  1 2 3 1 2 6 1 6 8 10
  
  
  Output
  
  
  10
  0
  2
  7
  
  Note
  
  In the first test case, you should decrease a_1 10 times to get the sum lower or equal to k = 10.
  
  In the second test case, the sum of array a is already less or equal to 69, so you don't need to change it.
  
  In the third test case, you can, for example: 
  
    1. set a_4 = a_3 = 1; 
    2. decrease a_4 by one, and get a_4 = 0. 
  
  As a result, you'll get array [1, 2, 1, 0, 1, 2, 1] with sum less or equal to 8 in 1 + 1 = 2 steps.
  
  In the fourth test case, you can, for example: 
  
    1. choose a_7 and decrease in by one 3 times; you'll get a_7 = -2; 
    2. choose 4 elements a_6, a_8, a_9 and a_{10} and them equal to a_7 = -2. 
  
  As a result, you'll get array [1, 2, 3, 1, 2, -2, -2, -2, -2, -2] with sum less or equal to 1 in 3 + 4 = 7 steps.
solution: import java.io.*;
  import java.util.Arrays;
  import java.util.Comparator;
  import java.util.InputMismatchException;
  import java.util.TreeSet;
  
  /**
   * Provide prove of correctness before implementation. Implementation can cost a lot of time.
   * Anti test that prove that it's wrong.
   * <p>
   * Do not confuse i j k g indexes, upTo and length. Do extra methods!!! Write more informative names to simulation
   * <p>
   * Will program ever exceed limit?
   * Try all approaches with prove of correctness if task is not obvious.
   * If you are given formula/rule: Try to play with it.
   * Analytic solution/Hardcoded solution/Constructive/Greedy/DP/Math/Brute force/Symmetric data
   * Number theory
   * Game theory (optimal play) that consider local and global strategy.
   */
  public class C_ {
  
      private void solveOne() {
          int n = nextInt();
          long k = nextLong();
          int[] a = nextIntArr(n);
  
          long sum = 0;
          for (int i : a) {
              sum += i;
          }
          if (n == 1) {
              System.out.println(Math.max(sum - k, 0));
              return;
          }
          if (sum <= k) {
              System.out.println(0);
              return;
          }
  
          radixSort2(a);
  
          long[] prefSum = new long[n];
          prefSum[0] = a[0];
          for (int i = 1; i < n; i++) {
              prefSum[i] = prefSum[i - 1] + a[i];
          }
  
          long ans = Long.MAX_VALUE;
          for (int i = 0; i < n; i++) {
              long steps = 0;
  
              int setEqualToMin = n - 1 - i;
              long sumOfSwaps = prefSum[n - 1] - prefSum[i] - (long) a[0] * setEqualToMin;
              steps += setEqualToMin;
              long reminder = sum - sumOfSwaps;
              if (reminder > k) {
                  if (setEqualToMin == 0)
                      steps += reminder - k;
                  else
                      steps += divCeil(reminder - k, setEqualToMin + 1);
              }
              ans = Math.min(ans, steps);
          }
          System.out.println(ans);
  
      }
  
      long divCeil(long a, long b) {
          return (a + b - 1) / b;
      }
  
      public static int[] radixSort2(int[] a) {
          int n = a.length;
          int[] c0 = new int[0x101];
          int[] c1 = new int[0x101];
          int[] c2 = new int[0x101];
          int[] c3 = new int[0x101];
          for (int v : a) {
              c0[(v & 0xff) + 1]++;
              c1[(v >>> 8 & 0xff) + 1]++;
              c2[(v >>> 16 & 0xff) + 1]++;
              c3[(v >>> 24 ^ 0x80) + 1]++;
          }
          for (int i = 0; i < 0xff; i++) {
              c0[i + 1] += c0[i];
              c1[i + 1] += c1[i];
              c2[i + 1] += c2[i];
              c3[i + 1] += c3[i];
          }
          int[] t = new int[n];
          for (int v : a) t[c0[v & 0xff]++] = v;
          for (int v : t) a[c1[v >>> 8 & 0xff]++] = v;
          for (int v : a) t[c2[v >>> 16 & 0xff]++] = v;
          for (int v : t) a[c3[v >>> 24 ^ 0x80]++] = v;
          return a;
      }
  
  
      private void solve() {
          int t = System.in.readInt();
          for (int tt = 0; tt < t; tt++) {
              solveOne();
          }
      }
  
      class AssertionRuntimeException extends RuntimeException {
  
          AssertionRuntimeException(Object expected,
                                    Object actual, Object... input) {
              super("expected = " + expected + ",\n actual = " + actual + ",\n " + Arrays.deepToString(input));
          }
      }
  
      private int nextInt() {
          return System.in.readInt();
      }
  
      private long nextLong() {
          return System.in.readLong();
      }
  
      private String nextString() {
          return System.in.readString();
      }
  
      private int[] nextIntArr(int n) {
          return System.in.readIntArray(n);
      }
  
      private long[] nextLongArr(int n) {
          return System.in.readLongArray(n);
      }
  
  
      public static void main(String[] args) {
          new C_().run();
      }
  
      static class System {
          private static FastInputStream in;
          private static FastPrintStream out;
      }
  
      private void run() {
          System.in = new FastInputStream(java.lang.System.in);
          System.out = new FastPrintStream(java.lang.System.out);
          solve();
          System.out.flush();
      }
  
      private static class FastPrintStream {
          private static final int BUF_SIZE = 8192;
          private final byte[] buf = new byte[BUF_SIZE];
          private final OutputStream out;
          private int ptr = 0;
  
          private FastPrintStream() {
              this(java.lang.System.out);
          }
  
          public FastPrintStream(OutputStream os) {
              this.out = os;
          }
  
          public FastPrintStream(String path) {
              try {
                  this.out = new FileOutputStream(path);
              } catch (FileNotFoundException e) {
                  throw new RuntimeException("FastWriter");
              }
          }
  
          public FastPrintStream print(byte b) {
              buf[ptr++] = b;
              if (ptr == BUF_SIZE) innerflush();
              return this;
          }
  
          public FastPrintStream print(char c) {
              return print((byte) c);
          }
  
          public FastPrintStream print(char[] s) {
              for (char c : s) {
                  buf[ptr++] = (byte) c;
                  if (ptr == BUF_SIZE) innerflush();
              }
              return this;
          }
  
          public FastPrintStream print(String s) {
              s.chars().forEach(c -> {
                  buf[ptr++] = (byte) c;
                  if (ptr == BUF_SIZE) innerflush();
              });
              return this;
          }
  
          //can be optimized
          public FastPrintStream print0(char[] s) {
              if (ptr + s.length < BUF_SIZE) {
                  for (char c : s) {
                      buf[ptr++] = (byte) c;
                  }
              } else {
                  for (char c : s) {
                      buf[ptr++] = (byte) c;
                      if (ptr == BUF_SIZE) innerflush();
                  }
              }
              return this;
          }
  
          //can be optimized
          public FastPrintStream print0(String s) {
              if (ptr + s.length() < BUF_SIZE) {
                  for (int i = 0; i < s.length(); i++) {
                      buf[ptr++] = (byte) s.charAt(i);
                  }
              } else {
                  for (int i = 0; i < s.length(); i++) {
                      buf[ptr++] = (byte) s.charAt(i);
                      if (ptr == BUF_SIZE) innerflush();
                  }
              }
              return this;
          }
  
          private static int countDigits(int l) {
              if (l >= 1000000000) return 10;
              if (l >= 100000000) return 9;
              if (l >= 10000000) return 8;
              if (l >= 1000000) return 7;
              if (l >= 100000) return 6;
              if (l >= 10000) return 5;
              if (l >= 1000) return 4;
              if (l >= 100) return 3;
              if (l >= 10) return 2;
              return 1;
          }
  
          public FastPrintStream print(int x) {
              if (x == Integer.MIN_VALUE) {
                  return print((long) x);
              }
              if (ptr + 12 >= BUF_SIZE) innerflush();
              if (x < 0) {
                  print((byte) '-');
                  x = -x;
              }
              int d = countDigits(x);
              for (int i = ptr + d - 1; i >= ptr; i--) {
                  buf[i] = (byte) ('0' + x % 10);
                  x /= 10;
              }
              ptr += d;
              return this;
          }
  
          private static int countDigits(long l) {
              if (l >= 1000000000000000000L) return 19;
              if (l >= 100000000000000000L) return 18;
              if (l >= 10000000000000000L) return 17;
              if (l >= 1000000000000000L) return 16;
              if (l >= 100000000000000L) return 15;
              if (l >= 10000000000000L) return 14;
              if (l >= 1000000000000L) return 13;
              if (l >= 100000000000L) return 12;
              if (l >= 10000000000L) return 11;
              if (l >= 1000000000L) return 10;
              if (l >= 100000000L) return 9;
              if (l >= 10000000L) return 8;
              if (l >= 1000000L) return 7;
              if (l >= 100000L) return 6;
              if (l >= 10000L) return 5;
              if (l >= 1000L) return 4;
              if (l >= 100L) return 3;
              if (l >= 10L) return 2;
              return 1;
          }
  
          public FastPrintStream print(long x) {
              if (x == Long.MIN_VALUE) {
                  return print("" + x);
              }
              if (ptr + 21 >= BUF_SIZE) innerflush();
              if (x < 0) {
                  print((byte) '-');
                  x = -x;
              }
              int d = countDigits(x);
              for (int i = ptr + d - 1; i >= ptr; i--) {
                  buf[i] = (byte) ('0' + x % 10);
                  x /= 10;
              }
              ptr += d;
              return this;
          }
  
          public FastPrintStream print(double x, int precision) {
              if (x < 0) {
                  print('-');
                  x = -x;
              }
              x += Math.pow(10, -precision) / 2;
              //		if(x < 0){ x = 0; }
              print((long) x).print(".");
              x -= (long) x;
              for (int i = 0; i < precision; i++) {
                  x *= 10;
                  print((char) ('0' + (int) x));
                  x -= (int) x;
              }
              return this;
          }
  
          public FastPrintStream println(int[] a, int from, int upTo, char separator) {
              for (int i = from; i < upTo; i++) {
                  print(a[i]);
                  print(separator);
              }
              print('\n');
              return this;
          }
  
          public FastPrintStream println(int[] a) {
              return println(a, 0, a.length, ' ');
          }
  
          public FastPrintStream println(char c) {
              return print(c).println();
          }
  
          public FastPrintStream println(int x) {
              return print(x).println();
          }
  
          public FastPrintStream println(long x) {
              return print(x).println();
          }
  
          public FastPrintStream println(String x) {
              return print(x).println();
          }
  
          public FastPrintStream println(double x, int precision) {
              return print(x, precision).println();
          }
  
          public FastPrintStream println() {
              return print((byte) '\n');
          }
  
          private void innerflush() {
              try {
                  out.write(buf, 0, ptr);
                  ptr = 0;
              } catch (IOException e) {
                  throw new RuntimeException("innerflush");
              }
          }
  
          public void flush() {
              innerflush();
              try {
                  out.flush();
              } catch (IOException e) {
                  throw new RuntimeException("flush");
              }
          }
      }
  
      private static class FastInputStream {
          private boolean finished = false;
  
          private InputStream stream;
          private byte[] buf = new byte[1024];
          private int curChar;
          private int numChars;
          private SpaceCharFilter filter;
  
          public FastInputStream(InputStream stream) {
              this.stream = stream;
          }
  
          public double[] readDoubleArray(int size) {
              double[] array = new double[size];
              for (int i = 0; i < size; i++) {
                  array[i] = readDouble();
              }
              return array;
          }
  
          public String[] readStringArray(int size) {
              String[] array = new String[size];
              for (int i = 0; i < size; i++) {
                  array[i] = readString();
              }
              return array;
          }
  
          public char[] readCharArray(int size) {
              char[] array = new char[size];
              for (int i = 0; i < size; i++) {
                  array[i] = readCharacter();
              }
              return array;
          }
  
          public void readIntArrays(int[]... arrays) {
              for (int i = 0; i < arrays[0].length; i++) {
                  for (int j = 0; j < arrays.length; j++) {
                      arrays[j][i] = readInt();
                  }
              }
          }
  
          public void readLongArrays(long[]... arrays) {
              for (int i = 0; i < arrays[0].length; i++) {
                  for (int j = 0; j < arrays.length; j++) {
                      arrays[j][i] = readLong();
                  }
              }
          }
  
          public void readDoubleArrays(double[]... arrays) {
              for (int i = 0; i < arrays[0].length; i++) {
                  for (int j = 0; j < arrays.length; j++) {
                      arrays[j][i] = readDouble();
                  }
              }
          }
  
          public char[][] readTable(int rowCount, int columnCount) {
              char[][] table = new char[rowCount][];
              for (int i = 0; i < rowCount; i++) {
                  table[i] = this.readCharArray(columnCount);
              }
              return table;
          }
  
          public int[][] readIntTable(int rowCount, int columnCount) {
              int[][] table = new int[rowCount][];
              for (int i = 0; i < rowCount; i++) {
                  table[i] = readIntArray(columnCount);
              }
              return table;
          }
  
          public double[][] readDoubleTable(int rowCount, int columnCount) {
              double[][] table = new double[rowCount][];
              for (int i = 0; i < rowCount; i++) {
                  table[i] = this.readDoubleArray(columnCount);
              }
              return table;
          }
  
          public long[][] readLongTable(int rowCount, int columnCount) {
              long[][] table = new long[rowCount][];
              for (int i = 0; i < rowCount; i++) {
                  table[i] = readLongArray(columnCount);
              }
              return table;
          }
  
          public String[][] readStringTable(int rowCount, int columnCount) {
              String[][] table = new String[rowCount][];
              for (int i = 0; i < rowCount; i++) {
                  table[i] = this.readStringArray(columnCount);
              }
              return table;
          }
  
          public String readText() {
              StringBuilder result = new StringBuilder();
              while (true) {
                  int character = read();
                  if (character == '\r') {
                      continue;
                  }
                  if (character == -1) {
                      break;
                  }
                  result.append((char) character);
              }
              return result.toString();
          }
  
          public void readStringArrays(String[]... arrays) {
              for (int i = 0; i < arrays[0].length; i++) {
                  for (int j = 0; j < arrays.length; j++) {
                      arrays[j][i] = readString();
                  }
              }
          }
  
          public long[] readLongArray(int size) {
              long[] array = new long[size];
              for (int i = 0; i < size; i++) {
                  array[i] = readLong();
              }
              return array;
          }
  
          public int[] readIntArray(int size) {
              int[] array = new int[size];
              for (int i = 0; i < size; i++) {
                  array[i] = readInt();
              }
              return array;
          }
  
          public int read() {
              if (numChars == -1) {
                  throw new InputMismatchException();
              }
              if (curChar >= numChars) {
                  curChar = 0;
                  try {
                      numChars = stream.read(buf);
                  } catch (IOException e) {
                      throw new InputMismatchException();
                  }
                  if (numChars <= 0) {
                      return -1;
                  }
              }
              return buf[curChar++];
          }
  
          public int peek() {
              if (numChars == -1) {
                  return -1;
              }
              if (curChar >= numChars) {
                  curChar = 0;
                  try {
                      numChars = stream.read(buf);
                  } catch (IOException e) {
                      return -1;
                  }
                  if (numChars <= 0) {
                      return -1;
                  }
              }
              return buf[curChar];
          }
  
          public int peekNonWhitespace() {
              while (isWhitespace(peek())) {
                  read();
              }
              return peek();
          }
  
          public int readInt() {
              int c = read();
              while (isSpaceChar(c)) {
                  c = read();
              }
              int sgn = 1;
              if (c == '-') {
                  sgn = -1;
                  c = read();
              }
              int res = 0;
              do {
                  if (c < '0' || c > '9') {
                      throw new InputMismatchException();
                  }
                  res *= 10;
                  res += c - '0';
                  c = read();
              } while (!isSpaceChar(c));
              return res * sgn;
          }
  
          public long readLong() {
              int c = read();
              while (isSpaceChar(c)) {
                  c = read();
              }
              int sgn = 1;
              if (c == '-') {
                  sgn = -1;
                  c = read();
              }
              long res = 0;
              do {
                  if (c < '0' || c > '9') {
                      throw new InputMismatchException();
                  }
                  res *= 10;
                  res += c - '0';
                  c = read();
              } while (!isSpaceChar(c));
              return res * sgn;
          }
  
          public String readString() {
              int c = read();
              while (isSpaceChar(c)) {
                  c = read();
              }
              StringBuilder res = new StringBuilder();
              do {
                  if (Character.isValidCodePoint(c)) {
                      res.appendCodePoint(c);
                  }
                  c = read();
              } while (!isSpaceChar(c));
              return res.toString();
          }
  
          public boolean isSpaceChar(int c) {
              if (filter != null) {
                  return filter.isSpaceChar(c);
              }
              return isWhitespace(c);
          }
  
          public static boolean isWhitespace(int c) {
              return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
          }
  
          private String readLine0() {
              StringBuilder buf = new StringBuilder();
              int c = read();
              while (c != '\n' && c != -1) {
                  if (c != '\r') {
                      buf.appendCodePoint(c);
                  }
                  c = read();
              }
              return buf.toString();
          }
  
          public String readLine() {
              String s = readLine0();
              while (s.trim().length() == 0) {
                  s = readLine0();
              }
              return s;
          }
  
          public String readLine(boolean ignoreEmptyLines) {
              if (ignoreEmptyLines) {
                  return readLine();
              } else {
                  return readLine0();
              }
          }
  
          public char readCharacter() {
              int c = read();
              while (isSpaceChar(c)) {
                  c = read();
              }
              return (char) c;
          }
  
          public double readDouble() {
              int c = read();
              while (isSpaceChar(c)) {
                  c = read();
              }
              int sgn = 1;
              if (c == '-') {
                  sgn = -1;
                  c = read();
              }
              double res = 0;
              while (!isSpaceChar(c) && c != '.') {
                  if (c == 'e' || c == 'E') {
                      return res * Math.pow(10, readInt());
                  }
                  if (c < '0' || c > '9') {
                      throw new InputMismatchException();
                  }
                  res *= 10;
                  res += c - '0';
                  c = read();
              }
              if (c == '.') {
                  c = read();
                  double m = 1;
                  while (!isSpaceChar(c)) {
                      if (c == 'e' || c == 'E') {
                          return res * Math.pow(10, readInt());
                      }
                      if (c < '0' || c > '9') {
                          throw new InputMismatchException();
                      }
                      m /= 10;
                      res += (c - '0') * m;
                      c = read();
                  }
              }
              return res * sgn;
          }
  
          public boolean isExhausted() {
              int value;
              while (isSpaceChar(value = peek()) && value != -1) {
                  read();
              }
              return value == -1;
          }
  
          public String next() {
              return readString();
          }
  
          public SpaceCharFilter getFilter() {
              return filter;
          }
  
          public void setFilter(SpaceCharFilter filter) {
              this.filter = filter;
          }
  
          public interface SpaceCharFilter {
              public boolean isSpaceChar(int ch);
          }
      }
  
  }