#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 5000100;
const long long mod = 1000000007;
int n , m;
bool is_gcd[N];
int que[N] , idx = 0;
int phi[N] , sum[N] , ch[N] , g[N];
int prime[N] , cnt = 0;
bool st[N];
int calc(int k) { return k * k % mod * (k + 1) % mod * (k + 1) % mod / 4 % mod;}
int gcd(int a , int b){ return b ? gcd(b , a % b) : a;}
void pre(int n) {
phi[1] = 1;
memset(st , 0 , sizeof st);
for(int i = 2 ; i <= n ; i ++) {
if(!st[i]) {
prime[++ cnt] = i;
st[i] = true;
phi[i] = i - 1;
}
for(int j = 1 ; prime[j] <= n / i ; j ++) {
st[prime[j] * i] = true;
if(i % prime[j] == 0) {
phi[i * prime[j]] = phi[i] * prime[j] % mod;
break;
}
else phi[i * prime[j]] = phi[i] * phi[prime[j]] % mod ;
}
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
memset(is_gcd , 0 , sizeof is_gcd);
cin >> m >> n;
pre(n + 10);
for(int i = 2 ; i <= n + 10; i ++) g[i] = phi[i] * i / 2 % mod * i % mod;
sum[1] = g[1] = 1;
for(int i = 2 ; i <= n + 10; i ++) sum[i] = (sum[i - 1] + g[i] * 2) % mod;
while(m --)
{
int a , b , x , k;
cin >> a >> b >> x >> k;
x = x % mod;
int tmp = gcd(a , b);
ch[tmp] = x * tmp % mod * tmp / a / b;
if(!is_gcd[tmp]){
is_gcd[tmp] = true;
que[++ idx] = tmp;
}
int temp = calc(k);
for(int i = 1 ; i <= idx ; i ++){
int t = k / que[i];
temp = temp - sum[t] * que[i] % mod * que[i];
temp = ((temp + sum[t] * ch[que[i]]) % mod + mod ) % mod;
}
cout << (temp % mod + mod) % mod << endl;
}
return 0;
}