#include <bits/stdc++.h>
using namespace std;
#define ll long long int
const int mod = 1e9+7;
const int MAX_N = 1e6;
unordered_map<ll,ll>factorialPrimeFactors;
vector<ll>spf(MAX_N+1,1);
void computeSPF(){
for(int i=2;i<=MAX_N;i++){
spf[i] = i;
}
for(ll i=2;i*i<=MAX_N;i++){
if(spf[i]==i){
ll start = i*i;
for(ll j= start;j<=MAX_N;j+=i){
spf[j] = i;
}
}
}
}
unordered_map<ll,ll> getPrimeFactorization(ll x){
unordered_map<ll,ll>factors;
while(x!=1){
ll g = spf[x];
factors[g]++;
x = x/g;
}
return factors;
}
void computeFactorialPrimeFactors(ll M){
for(ll i=2;i<=M;i++){
unordered_map<ll,ll>factors = getPrimeFactorization(i);
for(auto [prime,count]:factors){
factorialPrimeFactors[prime] += count;
}
}
}
ll computeDivisors(unordered_map<ll,ll>& factors){
ll divisors = 1;
for(auto [prime,exp]:factors){
divisors = ((divisors * (exp+1)%mod)%mod);
}
return divisors;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
ll N,M;
cin>>N>>M;
computeSPF();
vector<ll>A(N);
for(ll i=0;i<N;i++){
cin>>A[i];
}
computeFactorialPrimeFactors(M);
vector<ll>B(N);
for(ll i=0;i<N;i++){
// get factors for A[i]
unordered_map<ll,ll>factors = getPrimeFactorization(A[i]);
// Merge with factorial factors
for(auto [prime,exp] : factorialPrimeFactors){
factors[prime] += exp;
}
B[i] = computeDivisors(factors);
}
// print divisors
for(ll i=0;i<N;i++){
cout<<B[i]<<" ";
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgbGwgbG9uZyBsb25nIGludApjb25zdCBpbnQgbW9kID0gMWU5Kzc7CmNvbnN0IGludCBNQVhfTiA9IDFlNjsKdW5vcmRlcmVkX21hcDxsbCxsbD5mYWN0b3JpYWxQcmltZUZhY3RvcnM7CnZlY3RvcjxsbD5zcGYoTUFYX04rMSwxKTsKCgp2b2lkIGNvbXB1dGVTUEYoKXsKCWZvcihpbnQgaT0yO2k8PU1BWF9OO2krKyl7CgkJc3BmW2ldID0gaTsKCX0KCQoJZm9yKGxsIGk9MjtpKmk8PU1BWF9OO2krKyl7CgkJaWYoc3BmW2ldPT1pKXsKCQkJbGwgc3RhcnQgPSBpKmk7CgkJCWZvcihsbCBqPSBzdGFydDtqPD1NQVhfTjtqKz1pKXsKCQkJCXNwZltqXSA9IGk7CgkJCX0KCQl9Cgl9Cn0KCnVub3JkZXJlZF9tYXA8bGwsbGw+IGdldFByaW1lRmFjdG9yaXphdGlvbihsbCB4KXsKCXVub3JkZXJlZF9tYXA8bGwsbGw+ZmFjdG9yczsKCXdoaWxlKHghPTEpewoJCWxsIGcgPSBzcGZbeF07CgkJZmFjdG9yc1tnXSsrOwoJCXggPSB4L2c7Cgl9CglyZXR1cm4gZmFjdG9yczsKfQoKdm9pZCBjb21wdXRlRmFjdG9yaWFsUHJpbWVGYWN0b3JzKGxsIE0pewoJZm9yKGxsIGk9MjtpPD1NO2krKyl7CgkJdW5vcmRlcmVkX21hcDxsbCxsbD5mYWN0b3JzID0gZ2V0UHJpbWVGYWN0b3JpemF0aW9uKGkpOwoJCWZvcihhdXRvIFtwcmltZSxjb3VudF06ZmFjdG9ycyl7CgkJCWZhY3RvcmlhbFByaW1lRmFjdG9yc1twcmltZV0gKz0gY291bnQ7CgkJfQoJfQp9CgpsbCBjb21wdXRlRGl2aXNvcnModW5vcmRlcmVkX21hcDxsbCxsbD4mIGZhY3RvcnMpewoJbGwgZGl2aXNvcnMgPSAxOwoJZm9yKGF1dG8gW3ByaW1lLGV4cF06ZmFjdG9ycyl7CgkJZGl2aXNvcnMgPSAoKGRpdmlzb3JzICogKGV4cCsxKSVtb2QpJW1vZCk7Cgl9CglyZXR1cm4gZGl2aXNvcnM7Cn0KCmludCBtYWluKCkgewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwoJY2luLnRpZSgwKTsKCQoJbGwgTixNOwoJY2luPj5OPj5NOwoJY29tcHV0ZVNQRigpOwoJdmVjdG9yPGxsPkEoTik7Cglmb3IobGwgaT0wO2k8TjtpKyspewoJCWNpbj4+QVtpXTsKCX0KCQoJY29tcHV0ZUZhY3RvcmlhbFByaW1lRmFjdG9ycyhNKTsKCQoJdmVjdG9yPGxsPkIoTik7Cglmb3IobGwgaT0wO2k8TjtpKyspewoJCS8vIGdldCBmYWN0b3JzIGZvciBBW2ldCgkJdW5vcmRlcmVkX21hcDxsbCxsbD5mYWN0b3JzID0gZ2V0UHJpbWVGYWN0b3JpemF0aW9uKEFbaV0pOwoJCQoJCS8vIE1lcmdlIHdpdGggZmFjdG9yaWFsIGZhY3RvcnMKCQlmb3IoYXV0byBbcHJpbWUsZXhwXSA6IGZhY3RvcmlhbFByaW1lRmFjdG9ycyl7CgkJCWZhY3RvcnNbcHJpbWVdICs9IGV4cDsKCQl9CgkJCgkJQltpXSA9IGNvbXB1dGVEaXZpc29ycyhmYWN0b3JzKTsKCX0KCQoJLy8gcHJpbnQgZGl2aXNvcnMKCWZvcihsbCBpPTA7aTxOO2krKyl7CgkJY291dDw8QltpXTw8IiAiOwoJfQoJCglyZXR1cm4gMDsKfQ==