Luogu 4240:毒瘤之神的考驗
阿新 • • 發佈:2018-12-24
register 莫比烏斯 res http () 直接 wap code org
後面的卷積可以直接篩
\(\Theta(Tn)\) 當然不行了
設
\(f(i)=\sum_{d|i}\mu(\frac{i}{d})\frac{d}{\varphi(d)}\)
\(s(i,j,k)\) 表示 \(\sum_{p=1}^{k}g(i,p)g(j,p)f(p)\)
考慮到當 \(i\le \sqrt{n}\) 的時候 \(s(i,j,k)\) 中的 \(i,j \ge \sqrt{n}\)
當 \(i\ge \sqrt{n}\) 的時候 \(s(i,j,k)\) 中的 \(i,j \le \sqrt{n}\)
所以可以預處理到 \(s(80,80,k)\) 對於小於 \(n/80\) 的直接暴力
傳送門
Sol
分開考慮 \(\varphi(ij)\) 中 \(ij\) 的質因子
那麽
\[\varphi(ij)=\frac{\varphi(i)\varphi(j)gcd(i,j)}{\varphi(gcd(i,j))}\]
直接莫比烏斯反演
設 \(g(x,i)=\sum_{j=1}^{x}\varphi(ij)\)
那麽
\[ans=\sum_{i=1}^{min(n,m)}g(\lfloor\frac{n}{i}\rfloor,i)g(\lfloor\frac{m}{i}\rfloor,i)\sum_{d|i}\mu(\frac{i}{d})\frac{d}{\varphi(d)}\]
後面的卷積可以直接篩
\(\Theta(Tn)\) 當然不行了
設
\(f(i)=\sum_{d|i}\mu(\frac{i}{d})\frac{d}{\varphi(d)}\)
\(s(i,j,k)\) 表示 \(\sum_{p=1}^{k}g(i,p)g(j,p)f(p)\)
考慮到當 \(i\le \sqrt{n}\) 的時候 \(s(i,j,k)\) 中的 \(i,j \ge \sqrt{n}\)
當 \(i\ge \sqrt{n}\) 的時候 \(s(i,j,k)\) 中的 \(i,j \le \sqrt{n}\)
所以可以預處理到 \(s(80,80,k)\) 對於小於 \(n/80\)
# include <bits/stdc++.h> using namespace std; typedef long long ll; const int mod(998244353); const int maxn(1e5); const int blk(80); inline void Inc(int &x, int y) { if ((x += y) >= mod) x -= mod; } int pr[maxn + 100], phi[maxn + 100], inv[maxn + 100], mu[maxn + 100], tot, f[maxn + 100]; int test, n, m, ans; vector <int> g[maxn + 100], s[blk + 1][blk + 1]; bitset <maxn + 100> ispr; int main() { register int i, j, k, len; mu[1] = phi[1] = inv[1] = 1, ispr[1] = 1; for (i = 2; i <= maxn; ++i) inv[i] = (ll)(mod - mod / i) * inv[mod % i] % mod; for (i = 2; i <= maxn; ++i) { if (!ispr[i]) pr[++tot] = i, mu[i] = -1, phi[i] = i - 1; for (j = 1; j <= tot && i * pr[j] <= maxn; ++j) { ispr[i * pr[j]] = 1; if (i % pr[j]) mu[i * pr[j]] = -mu[i], phi[i * pr[j]] = phi[i] * (pr[j] - 1); else { mu[i * pr[j]] = 0; phi[i * pr[j]] = phi[i] * pr[j]; break; } } } for (i = 1; i <= maxn; ++i) Inc(mu[i], mod); for (i = 1; i <= maxn; ++i) for (j = i; j <= maxn; j += i) Inc(f[j], (ll)i * inv[phi[i]] % mod * mu[j / i] % mod); for (i = 1; i <= maxn; ++i) { len = maxn / i, g[i].resize(len + 1); for (j = 1; j <= len; ++j) g[i][j] = (g[i][j - 1] + phi[i * j]) % mod; } for (i = 1; i <= blk; ++i) for (j = i; j <= blk; ++j) { len = maxn / j, s[i][j].resize(len + 1); for (k = 1; k <= len; ++k) s[i][j][k] = (s[i][j][k - 1] + (ll)f[k] * g[k][i] % mod * g[k][j] % mod) % mod; } for (scanf("%d", &test); test; --test) { ans = 0, scanf("%d%d", &n, &m); if (n > m) swap(n, m); len = min(n, m / blk); for (i = 1; i <= len; ++i) Inc(ans, (ll)g[i][n / i] * g[i][m / i] % mod * f[i] % mod); for (i = len + 1; i <= n; i = j + 1) { j = min(n / (n / i), m / (m / i)); Inc(ans, (s[n / i][m / i][j] - s[n / i][m / i][i - 1] + mod) % mod); } printf("%d\n", ans); } return 0; }
Luogu 4240:毒瘤之神的考驗