import java.io.*;
import java.util.*;
public class Main {
static final int MAXN = 1_000_000;
static final long MOD = 1_000_000_007L;
static int[] spf = new int[MAXN + 1];
static void computeSPF() {
for (int i = 2; i <= MAXN; i++) spf[i] = i;
for (int i = 2; (long) i * i <= MAXN; i++) {
if (spf[i] == i) {
for (int j = i * i; j <= MAXN; j += i) {
if (spf[j] == j) spf[j] = i;
}
}
}
}
static HashMap
<Integer, Long
> factorMap
(long x
) { HashMap
<Integer, Long
> map
= new HashMap
<>(); while (x > 1) {
int p = spf[(int) x];
long cnt = 0;
while (x % p == 0) {
x /= p;
cnt++;
}
map.put(p, map.getOrDefault(p, 0L) + cnt);
}
return map;
}
FastScanner fs
= new FastScanner
(System.
in); int n = fs.nextInt();
int m = fs.nextInt();
computeSPF();
HashMap
<Integer, Long
> base
= new HashMap
<>(); for (int i = 2; i <= m; i++) {
HashMap
<Integer, Long
> fm
= factorMap
(i
); for (Map.
Entry<Integer, Long
> e
: fm.
entrySet()) { base.put(e.getKey(), base.getOrDefault(e.getKey(), 0L) + e.getValue());
}
}
StringBuilder out = new StringBuilder();
for (int i = 1; i <= n; i++) {
long val = fs.nextLong();
HashMap
<Integer, Long
> merged
= new HashMap
<>(base
); HashMap
<Integer, Long
> fm
= factorMap
(val
); for (Map.
Entry<Integer, Long
> e
: fm.
entrySet()) { merged.put(e.getKey(), merged.getOrDefault(e.getKey(), 0L) + e.getValue());
}
long ans = 1L;
for (long exp : merged.values()) {
ans = (ans * ((exp + 1) % MOD)) % MOD;
}
out.append(ans).append(i == n ? "\n" : " ");
}
System.
out.
print(out.
toString()); }
static final class FastScanner {
private final byte[] buffer = new byte[1 << 16];
private int ptr = 0, len = 0;
if (ptr >= len) {
len = in.read(buffer);
ptr = 0;
if (len <= 0) return -1;
}
return buffer[ptr++];
}
int c
; while ((c
= read
()) <= 32) if (c
== -1) return Long.
MIN_VALUE; int sign = 1;
if (c == '-') { sign = -1; c = read(); }
long val = 0;
while (c > 32) { val = val * 10 + (c - '0'); c = read(); }
return val * sign;
}
int nextInt
() throws IOException { return (int) nextLong
(); } }
}
aW1wb3J0IGphdmEuaW8uKjsKaW1wb3J0IGphdmEudXRpbC4qOwoKcHVibGljIGNsYXNzIE1haW4gewogICAgc3RhdGljIGZpbmFsIGludCBNQVhOID0gMV8wMDBfMDAwOwogICAgc3RhdGljIGZpbmFsIGxvbmcgTU9EID0gMV8wMDBfMDAwXzAwN0w7CiAgICBzdGF0aWMgaW50W10gc3BmID0gbmV3IGludFtNQVhOICsgMV07CgogICAgc3RhdGljIHZvaWQgY29tcHV0ZVNQRigpIHsKICAgICAgICBmb3IgKGludCBpID0gMjsgaSA8PSBNQVhOOyBpKyspIHNwZltpXSA9IGk7CiAgICAgICAgZm9yIChpbnQgaSA9IDI7IChsb25nKSBpICogaSA8PSBNQVhOOyBpKyspIHsKICAgICAgICAgICAgaWYgKHNwZltpXSA9PSBpKSB7CiAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gaSAqIGk7IGogPD0gTUFYTjsgaiArPSBpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNwZltqXSA9PSBqKSBzcGZbal0gPSBpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHN0YXRpYyBIYXNoTWFwPEludGVnZXIsIExvbmc+IGZhY3Rvck1hcChsb25nIHgpIHsKICAgICAgICBIYXNoTWFwPEludGVnZXIsIExvbmc+IG1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICB3aGlsZSAoeCA+IDEpIHsKICAgICAgICAgICAgaW50IHAgPSBzcGZbKGludCkgeF07CiAgICAgICAgICAgIGxvbmcgY250ID0gMDsKICAgICAgICAgICAgd2hpbGUgKHggJSBwID09IDApIHsKICAgICAgICAgICAgICAgIHggLz0gcDsKICAgICAgICAgICAgICAgIGNudCsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1hcC5wdXQocCwgbWFwLmdldE9yRGVmYXVsdChwLCAwTCkgKyBjbnQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbWFwOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIEZhc3RTY2FubmVyIGZzID0gbmV3IEZhc3RTY2FubmVyKFN5c3RlbS5pbik7CiAgICAgICAgaW50IG4gPSBmcy5uZXh0SW50KCk7CiAgICAgICAgaW50IG0gPSBmcy5uZXh0SW50KCk7CiAgICAgICAgY29tcHV0ZVNQRigpOwoKICAgICAgICBIYXNoTWFwPEludGVnZXIsIExvbmc+IGJhc2UgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgZm9yIChpbnQgaSA9IDI7IGkgPD0gbTsgaSsrKSB7CiAgICAgICAgICAgIEhhc2hNYXA8SW50ZWdlciwgTG9uZz4gZm0gPSBmYWN0b3JNYXAoaSk7CiAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PEludGVnZXIsIExvbmc+IGUgOiBmbS5lbnRyeVNldCgpKSB7CiAgICAgICAgICAgICAgICBiYXNlLnB1dChlLmdldEtleSgpLCBiYXNlLmdldE9yRGVmYXVsdChlLmdldEtleSgpLCAwTCkgKyBlLmdldFZhbHVlKCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBTdHJpbmdCdWlsZGVyIG91dCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CiAgICAgICAgICAgIGxvbmcgdmFsID0gZnMubmV4dExvbmcoKTsKICAgICAgICAgICAgSGFzaE1hcDxJbnRlZ2VyLCBMb25nPiBtZXJnZWQgPSBuZXcgSGFzaE1hcDw+KGJhc2UpOwogICAgICAgICAgICBIYXNoTWFwPEludGVnZXIsIExvbmc+IGZtID0gZmFjdG9yTWFwKHZhbCk7CiAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PEludGVnZXIsIExvbmc+IGUgOiBmbS5lbnRyeVNldCgpKSB7CiAgICAgICAgICAgICAgICBtZXJnZWQucHV0KGUuZ2V0S2V5KCksIG1lcmdlZC5nZXRPckRlZmF1bHQoZS5nZXRLZXkoKSwgMEwpICsgZS5nZXRWYWx1ZSgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsb25nIGFucyA9IDFMOwogICAgICAgICAgICBmb3IgKGxvbmcgZXhwIDogbWVyZ2VkLnZhbHVlcygpKSB7CiAgICAgICAgICAgICAgICBhbnMgPSAoYW5zICogKChleHAgKyAxKSAlIE1PRCkpICUgTU9EOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG91dC5hcHBlbmQoYW5zKS5hcHBlbmQoaSA9PSBuID8gIlxuIiA6ICIgIik7CiAgICAgICAgfQogICAgICAgIFN5c3RlbS5vdXQucHJpbnQob3V0LnRvU3RyaW5nKCkpOwogICAgfQoKICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBGYXN0U2Nhbm5lciB7CiAgICAgICAgcHJpdmF0ZSBmaW5hbCBJbnB1dFN0cmVhbSBpbjsKICAgICAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsxIDw8IDE2XTsKICAgICAgICBwcml2YXRlIGludCBwdHIgPSAwLCBsZW4gPSAwOwogICAgICAgIEZhc3RTY2FubmVyKElucHV0U3RyZWFtIGlzKSB7IGluID0gaXM7IH0KICAgICAgICBwcml2YXRlIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgICAgaWYgKHB0ciA+PSBsZW4pIHsKICAgICAgICAgICAgICAgIGxlbiA9IGluLnJlYWQoYnVmZmVyKTsKICAgICAgICAgICAgICAgIHB0ciA9IDA7CiAgICAgICAgICAgICAgICBpZiAobGVuIDw9IDApIHJldHVybiAtMTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYnVmZmVyW3B0cisrXTsKICAgICAgICB9CiAgICAgICAgbG9uZyBuZXh0TG9uZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgICAgIGludCBjOyB3aGlsZSAoKGMgPSByZWFkKCkpIDw9IDMyKSBpZiAoYyA9PSAtMSkgcmV0dXJuIExvbmcuTUlOX1ZBTFVFOwogICAgICAgICAgICBpbnQgc2lnbiA9IDE7CiAgICAgICAgICAgIGlmIChjID09ICctJykgeyBzaWduID0gLTE7IGMgPSByZWFkKCk7IH0KICAgICAgICAgICAgbG9uZyB2YWwgPSAwOwogICAgICAgICAgICB3aGlsZSAoYyA+IDMyKSB7IHZhbCA9IHZhbCAqIDEwICsgKGMgLSAnMCcpOyBjID0gcmVhZCgpOyB9CiAgICAgICAgICAgIHJldHVybiB2YWwgKiBzaWduOwogICAgICAgIH0KICAgICAgICBpbnQgbmV4dEludCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7IHJldHVybiAoaW50KSBuZXh0TG9uZygpOyB9CiAgICB9Cn0K