description: Three little pigs from all over the world are meeting for a convention! Every minute, a triple of 3 new pigs arrives on the convention floor. After the n-th minute, the convention ends.
  
  The big bad wolf has learned about this convention, and he has an attack plan. At some minute in the convention, he will arrive and eat exactly x pigs. Then he will get away.
  
  The wolf wants Gregor to help him figure out the number of possible attack plans that involve eating exactly x pigs for various values of x (1 ≤ x ≤ 3n). Two attack plans are considered different, if they occur at different times or if the sets of little pigs to eat are different.
  
  Note that all queries are independent, that is, the wolf does not eat the little pigs, he only makes plans!
  
  Input
  
  The first line of input contains two integers n and q (1 ≤ n ≤ 10^6, 1 ≤ q ≤ 2⋅ 10^5), the number of minutes the convention lasts and the number of queries the wolf asks.
  
  Each of the next q lines contains a single integer x_i (1 ≤ x_i ≤ 3n), the number of pigs the wolf will eat in the i-th query.
  
  Output
  
  You should print q lines, with line i representing the number of attack plans if the wolf wants to eat x_i pigs. Since each query answer can be large, output each answer modulo 10^9+7.
  
  Examples
  
  Input
  
  
  2 3
  1
  5
  6
  
  
  Output
  
  
  9
  6
  1
  
  
  Input
  
  
  5 4
  2
  4
  6
  8
  
  
  Output
  
  
  225
  2001
  6014
  6939
  
  Note
  
  In the example test, n=2. Thus, there are 3 pigs at minute 1, and 6 pigs at minute 2. There are three queries: x=1, x=5, and x=6.
  
  If the wolf wants to eat 1 pig, he can do so in 3+6=9 possible attack plans, depending on whether he arrives at minute 1 or 2.
  
  If the wolf wants to eat 5 pigs, the wolf cannot arrive at minute 1, since there aren't enough pigs at that time. Therefore, the wolf has to arrive at minute 2, and there are 6 possible attack plans.
  
  If the wolf wants to eat 6 pigs, his only plan is to arrive at the end of the convention and devour everybody.
  
  Remember to output your answers modulo 10^9+7!
solution: import java.io.OutputStream;
  import java.io.IOException;
  import java.io.InputStream;
  import java.io.OutputStream;
  import java.io.IOException;
  import java.lang.reflect.Field;
  import java.nio.charset.StandardCharsets;
  import java.io.UncheckedIOException;
  import java.io.Closeable;
  import java.math.BigInteger;
  import java.io.InputStream;
  
  /**
   * Built using CHelper plug-in
   * Actual solution is at the top
   */
  public class Main {
      public static void main(String[] args) throws Exception {
          Thread thread = new Thread(null, new TaskAdapter(), "", 1 << 29);
          thread.start();
          thread.join();
      }
  
      static class TaskAdapter implements Runnable {
          @Override
          public void run() {
              InputStream inputStream = System.in;
              OutputStream outputStream = System.out;
              FastInput in = new FastInput(inputStream);
              FastOutput out = new FastOutput(outputStream);
              CTheThreeLittlePigs solver = new CTheThreeLittlePigs();
              solver.solve(1, in, out);
              out.close();
          }
      }
  
      static class CTheThreeLittlePigs {
          int mod = (int) 1e9 + 7;
          Power pow = new Power(mod);
          int inv3 = pow.inverse(3);
  
          public void solve(int testNumber, FastInput in, FastOutput out) {
              int n = in.ri();
              int q = in.ri();
              Factorial fact = new Factorial(3 * n + 10, mod);
              Combination comb = new Combination(fact);
              long[][] dp = new long[3][3 * n + 1];
              dp[0][0] = dp[1][0] = dp[2][0] = n;
              long[] b = new long[3];
              for (int i = 1; i <= 3 * n; i++) {
                  long sumB = 0;
                  for (int j = 1; j < 3; j++) {
                      b[j] = b[j - 1] + dp[j - 1][i - 1];
                      sumB += b[j];
                  }
                  long sum = comb.combination(3 * n, i + 1);
                  long x = (sum - sumB) % mod * inv3 % mod;
                  for (int j = 0; j < 3; j++) {
                      dp[j][i] = x + b[j];
                      dp[j][i] = DigitUtils.mod(dp[j][i], mod);
                  }
              }
              for (int i = 0; i < q; i++) {
                  int x = in.ri();
                  long ans = dp[0][x] + comb.combination(3 * n, x);
                  if (ans >= mod) {
                      ans -= mod;
                  }
                  out.println(ans);
              }
          }
  
      }
  
      static class Power implements InverseNumber {
          int mod;
  
          public Power(int mod) {
              this.mod = mod;
          }
  
          public int inverse(int x) {
              int ans = inverseExtGCD(x);
  //        if(modular.mul(ans, x) != 1){
  //            throw new IllegalStateException();
  //        }
              return ans;
          }
  
          public int inverseExtGCD(int x) {
              return (int) DigitUtils.modInverse(x, mod);
          }
  
      }
  
      static interface IntCombination {
      }
  
      static class Combination implements IntCombination {
          final Factorial factorial;
          int modVal;
  
          public Combination(Factorial factorial) {
              this.factorial = factorial;
              this.modVal = factorial.getMod();
          }
  
          public Combination(int limit, int mod) {
              this(new Factorial(limit, mod));
          }
  
          public int combination(int m, int n) {
              if (n > m || n < 0) {
                  return 0;
              }
              return (int) ((long) factorial.fact(m) * factorial.invFact(n) % modVal * factorial.invFact(m - n) % modVal);
          }
  
      }
  
      static class ExtGCD {
          public static long extGCD(long a, long b, long[] xy) {
              if (a >= b) {
                  return extGCD0(a, b, xy);
              }
              long ans = extGCD0(b, a, xy);
              SequenceUtils.swap(xy, 0, 1);
              return ans;
          }
  
          private static long extGCD0(long a, long b, long[] xy) {
              if (b == 0) {
                  xy[0] = 1;
                  xy[1] = 0;
                  return a;
              }
              long ans = extGCD0(b, a % b, xy);
              long x = xy[0];
              long y = xy[1];
              xy[0] = y;
              xy[1] = x - a / b * y;
              return ans;
          }
  
      }
  
      static class SequenceUtils {
          public static void swap(long[] data, int i, int j) {
              long tmp = data[i];
              data[i] = data[j];
              data[j] = tmp;
          }
  
      }
  
      static interface InverseNumber {
      }
  
      static class FastOutput implements AutoCloseable, Closeable, Appendable {
          private static final int THRESHOLD = 32 << 10;
          private OutputStream writer;
          private StringBuilder cache = new StringBuilder(THRESHOLD * 2);
          private static Field stringBuilderValueField;
          private char[] charBuf = new char[THRESHOLD * 2];
          private byte[] byteBuf = new byte[THRESHOLD * 2];
  
          static {
              try {
                  stringBuilderValueField = StringBuilder.class.getSuperclass().getDeclaredField("value");
                  stringBuilderValueField.setAccessible(true);
              } catch (Exception e) {
                  stringBuilderValueField = null;
              }
              stringBuilderValueField = null;
          }
  
          public FastOutput append(CharSequence csq) {
              cache.append(csq);
              return this;
          }
  
          public FastOutput append(CharSequence csq, int start, int end) {
              cache.append(csq, start, end);
              return this;
          }
  
          private void afterWrite() {
              if (cache.length() < THRESHOLD) {
                  return;
              }
              flush();
          }
  
          public FastOutput(OutputStream writer) {
              this.writer = writer;
          }
  
          public FastOutput append(char c) {
              cache.append(c);
              afterWrite();
              return this;
          }
  
          public FastOutput append(long c) {
              cache.append(c);
              afterWrite();
              return this;
          }
  
          public FastOutput println(long c) {
              return append(c).println();
          }
  
          public FastOutput println() {
              return append('\n');
          }
  
          public FastOutput flush() {
              try {
                  if (stringBuilderValueField != null) {
                      try {
                          byte[] value = (byte[]) stringBuilderValueField.get(cache);
                          writer.write(value, 0, cache.length());
                      } catch (Exception e) {
                          stringBuilderValueField = null;
                      }
                  }
                  if (stringBuilderValueField == null) {
                      int n = cache.length();
                      if (n > byteBuf.length) {
                          //slow
                          writer.write(cache.toString().getBytes(StandardCharsets.UTF_8));
  //                writer.append(cache);
                      } else {
                          cache.getChars(0, n, charBuf, 0);
                          for (int i = 0; i < n; i++) {
                              byteBuf[i] = (byte) charBuf[i];
                          }
                          writer.write(byteBuf, 0, n);
                      }
                  }
                  writer.flush();
                  cache.setLength(0);
              } catch (IOException e) {
                  throw new UncheckedIOException(e);
              }
              return this;
          }
  
          public void close() {
              flush();
              try {
                  writer.close();
              } catch (IOException e) {
                  throw new UncheckedIOException(e);
              }
          }
  
          public String toString() {
              return cache.toString();
          }
  
      }
  
      static class FastInput {
          private final InputStream is;
          private byte[] buf = new byte[1 << 13];
          private int bufLen;
          private int bufOffset;
          private int next;
  
          public FastInput(InputStream is) {
              this.is = is;
          }
  
          private int read() {
              while (bufLen == bufOffset) {
                  bufOffset = 0;
                  try {
                      bufLen = is.read(buf);
                  } catch (IOException e) {
                      bufLen = -1;
                  }
                  if (bufLen == -1) {
                      return -1;
                  }
              }
              return buf[bufOffset++];
          }
  
          public void skipBlank() {
              while (next >= 0 && next <= 32) {
                  next = read();
              }
          }
  
          public int ri() {
              return readInt();
          }
  
          public int readInt() {
              boolean rev = false;
  
              skipBlank();
              if (next == '+' || next == '-') {
                  rev = next == '-';
                  next = read();
              }
  
              int val = 0;
              while (next >= '0' && next <= '9') {
                  val = val * 10 - next + '0';
                  next = read();
              }
  
              return rev ? val : -val;
          }
  
      }
  
      static class DigitUtils {
          private static LongExtGCDObject longExtGCDObject = new LongExtGCDObject();
  
          private DigitUtils() {
          }
  
          public static int mod(long x, int mod) {
              if (x < -mod || x >= mod) {
                  x %= mod;
              }
              if (x < 0) {
                  x += mod;
              }
              return (int) x;
          }
  
          public static long mod(long x, long mod) {
              if (x < -mod || x >= mod) {
                  x %= mod;
              }
              if (x < 0) {
                  x += mod;
              }
              return x;
          }
  
          public static long modInverse(long x, long mod) {
              long g = longExtGCDObject.extgcd(x, mod);
              assert g == 1;
              long a = longExtGCDObject.getX();
              return DigitUtils.mod(a, mod);
          }
  
      }
  
      static class Factorial {
          int[] fact;
          int[] inv;
          int mod;
  
          public int getMod() {
              return mod;
          }
  
          public Factorial(int[] fact, int[] inv, int mod) {
              this.mod = mod;
              this.fact = fact;
              this.inv = inv;
              fact[0] = inv[0] = 1;
              int n = Math.min(fact.length, mod);
              for (int i = 1; i < n; i++) {
                  fact[i] = i;
                  fact[i] = (int) ((long) fact[i] * fact[i - 1] % mod);
              }
              if (n - 1 >= 0) {
                  inv[n - 1] = BigInteger.valueOf(fact[n - 1]).modInverse(BigInteger.valueOf(mod)).intValue();
              }
              for (int i = n - 2; i >= 1; i--) {
                  inv[i] = (int) ((long) inv[i + 1] * (i + 1) % mod);
              }
          }
  
          public Factorial(int limit, int mod) {
              this(new int[Math.min(limit + 1, mod)], new int[Math.min(limit + 1, mod)], mod);
          }
  
          public int fact(int n) {
              if (n >= mod) {
                  return 0;
              }
              return fact[n];
          }
  
          public int invFact(int n) {
              if (n >= mod) {
                  throw new IllegalArgumentException();
              }
              return inv[n];
          }
  
      }
  
      static class LongExtGCDObject {
          private long[] xy = new long[2];
  
          public long extgcd(long a, long b) {
              return ExtGCD.extGCD(a, b, xy);
          }
  
          public long getX() {
              return xy[0];
          }
  
      }
  }
  
  