#include<bits/stdc++.h>
using namespace std;
#define int long long int
const int MOD = 1e9+7;
const int MAXN = 1e6;
vector<int> spf(MAXN + 1, 0);
void computeSpf(){
for (int i = 2; i <= MAXN; i++){
spf[i] = i;
}
// starting the sieve process
for (int i = 2; i * i <= MAXN; i++){
if(spf[i] == i){
for (int j = i*i; j <= MAXN; j += i){
if(spf[j] == j){
spf[j] = i;
}
}
}
}
}
unordered_map<int, int> calFactors(int n){
unordered_map<int, int> mp;
while(n != 1){
int d = spf[n];
mp[d]++;
n /= d;
}
return mp;
}
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
// int t; cin >> t;
// while (t--) {
// solve();
// }
computeSpf();
int n, m; cin >> n >> m;
vector<int> input(n);
unordered_map<int, int> mp1;
for (int i = 2; i <= m; i++){
unordered_map<int, int> temp = calFactors(i);
for (auto itr: temp){
mp1[itr.first] += itr.second;
}
}
for (int i = 0; i < n; i ++){
unordered_map<int, int> mp2 = mp1;
int g = 1;
cin >> input[i];
unordered_map<int, int> factors = calFactors(input[i]);
for (auto itr : factors){
mp2[itr.first] += itr.second;
}
for (auto j : mp2){
g = ((g % MOD) * ((j.second % MOD + 1 % MOD) % MOD)) % MOD;
}
cout << g << " ";
}
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBpbnQgbG9uZyBsb25nIGludApjb25zdCBpbnQgTU9EID0gMWU5Kzc7Cgpjb25zdCBpbnQgTUFYTiA9IDFlNjsKdmVjdG9yPGludD4gc3BmKE1BWE4gKyAxLCAwKTsKCnZvaWQgY29tcHV0ZVNwZigpewogICAgZm9yIChpbnQgaSA9IDI7IGkgPD0gTUFYTjsgaSsrKXsKICAgIAlzcGZbaV0gPSBpOwogICAgfQogICAgCiAgICAvLyBzdGFydGluZyB0aGUgc2lldmUgcHJvY2VzcwogICAgCiAgICBmb3IgKGludCBpID0gMjsgaSAqIGkgPD0gTUFYTjsgaSsrKXsKICAgIAlpZihzcGZbaV0gPT0gaSl7CiAgICAJCWZvciAoaW50IGogPSBpKmk7IGogPD0gTUFYTjsgaiArPSBpKXsKICAgIAkJCWlmKHNwZltqXSA9PSBqKXsKICAgIAkJCQlzcGZbal0gPSBpOwogICAgCQkJfQogICAgCQl9CiAgICAJfQogICAgfQogICAgCn0KCnVub3JkZXJlZF9tYXA8aW50LCBpbnQ+IGNhbEZhY3RvcnMoaW50IG4pewoJdW5vcmRlcmVkX21hcDxpbnQsIGludD4gbXA7CgkKCXdoaWxlKG4gIT0gMSl7CgkJaW50IGQgPSBzcGZbbl07CgkJbXBbZF0rKzsKCQluIC89IGQ7Cgl9CgkKCXJldHVybiBtcDsKfQoKCnNpZ25lZCBtYWluKCkgewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsKICAgIGNpbi50aWUoMCk7IGNvdXQudGllKDApOwogICAgCiAgICAvLyBpbnQgdDsgY2luID4+IHQ7CiAgICAvLyB3aGlsZSAodC0tKSB7CiAgICAvLyAgICAgc29sdmUoKTsKICAgIC8vIH0KICAgIGNvbXB1dGVTcGYoKTsKICAgIGludCBuLCBtOyBjaW4gPj4gbiA+PiBtOwogICAgdmVjdG9yPGludD4gaW5wdXQobik7CiAgICAKICAgIHVub3JkZXJlZF9tYXA8aW50LCBpbnQ+IG1wMTsKICAgIGZvciAoaW50IGkgPSAyOyBpIDw9IG07IGkrKyl7CiAgICAJdW5vcmRlcmVkX21hcDxpbnQsIGludD4gdGVtcCA9IGNhbEZhY3RvcnMoaSk7CiAgICAJCiAgICAJZm9yIChhdXRvIGl0cjogdGVtcCl7CiAgICAJCW1wMVtpdHIuZmlyc3RdICs9IGl0ci5zZWNvbmQ7CiAgICAJfQogICAgfQogICAgCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkgKyspewogICAgCXVub3JkZXJlZF9tYXA8aW50LCBpbnQ+IG1wMiA9IG1wMTsKICAgIAlpbnQgZyA9IDE7CiAgICAJY2luID4+IGlucHV0W2ldOwogICAgCQogICAgCXVub3JkZXJlZF9tYXA8aW50LCBpbnQ+IGZhY3RvcnMgPSBjYWxGYWN0b3JzKGlucHV0W2ldKTsKICAgIAkKICAgIAlmb3IgKGF1dG8gaXRyIDogZmFjdG9ycyl7CiAgICAJCW1wMltpdHIuZmlyc3RdICs9IGl0ci5zZWNvbmQ7CiAgICAJfQogICAgCQogICAgCWZvciAoYXV0byBqIDogbXAyKXsKICAgIAkJZyA9ICgoZyAlIE1PRCkgKiAoKGouc2Vjb25kICUgTU9EICsgMSAlIE1PRCkgJSBNT0QpKSAlIE1PRDsKICAgIAl9CiAgICAJCiAgICAJY291dCA8PCBnIDw8ICIgIjsKICAgIH0KICAgIAogICAgcmV0dXJuIDA7Cn0=