題目太長了略去不表。
聽說這個題正解是
觀察
設
因此我們有
然後。。。。。
如果我們可以
而這要求我們對
考慮遞推,對於
這樣的複雜度是
我們想辦法把log去掉,注意對於
複雜度就變成了
【代碼】
不要問我爲什麼有些奇怪的無用的東西。。
#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for (int i = a, _ = b; i <= _; i ++)
#define cerr cerr << ">>> "
const int mod = 1000000007;
const int N = 4000003;
inline int Pow(int a, int b) {
a %= mod;
int t = 1;
while (b) {
if (b & 1) t = 1ll * t * a % mod;
a = 1ll * a * a % mod , b >>= 1;
}
return t;
}
inline int ars(int n) {
return 1ll * n * (n + 1) / 2 % mod;
}
int p[N], f[N], vis[N], S[N], pr[N / 10], tot;
int e[N], mn[N], inv[N];
void init(int n) {
inv[1] = 1;
rep (i , 2 , n) inv[i] = mod - 1ll * (mod / i) * inv[mod % i] % mod;
S[1] = 1;
rep (i , 2 , n) {
if (!vis[i])
pr[++ tot] = i, S[i] = mod + 1 - inv[i], mn[i] = i, e[i] = i;
for (int j = 1; j <= tot && i * pr[j] <= n; j ++) {
int d = pr[j], t = i * d;
vis[t] = 1;
if (i % d == 0) {
mn[t] = d;
e[t] = e[i] * d;
S[t] = (1ll * S[t / e[t]] - 1ll * inv[d] * S[t / e[t]]) % mod;
break;
}
e[t] = mn[t] = min(mn[i], d);
S[t] = 1ll * (1 - inv[mn[t]] + mod) * S[i] % mod;
}
}
int inv2 = (mod + 1) / 2;
rep (i , 2 , n) S[i] = (1ll * S[i] * i % mod * i % mod * inv2 % mod + mod) % mod;
S[1] = 1;
rep (i , 2 , n) S[i] = (S[i - 1] + 2ll * i * S[i] % mod) % mod;
rep (i , 1 , n) f[i] = 1ll * i * i % mod, p[i] = 1;
}
int x[N], g[N];
int n, m;
int gao(int a, int b) {
if (a > b) swap(a, b);
if (b % a == 0) return b / a % mod;
return 1ll * b * Pow(b % a, mod - 2) % mod * gao(a, b % a) % mod;
}
int main() {
ios::sync_with_stdio(0);
cin >> m >> n;
init(n);
rep (i , 1 , m) {
int k, a, b;
long long y;
cin >> a >> b >> y >> k;
x[i] = y % mod;
g[i] = __gcd(a, b);
int tw = gao(a, b);
int w = 1ll * tw * f[g[i]] % mod;
f[g[i]] = 1ll * x[i] * Pow(tw, mod - 2) % mod;
int ans = 1ll * ars(k) * ars(k) % mod;
x[i] = 1ll * x[i] * Pow(w, mod - 2) % mod;
w = x[i];
x[i] = 1ll * (w + mod - 1) * p[g[i]] % mod;
p[g[i]] = 1ll * p[g[i]] * w % mod;
rep (j , 1 , i)
(ans += 1ll * g[j] * g[j] % mod * S[k / g[j]] % mod * x[j] % mod) %= mod;
if (ans < 0) ans += mod;
printf("%d\n", ans);
}
return 0;
}