題解 P6055 【[RC-02] GCD】
\[ans=\sum_{i=1}^N\sum_{j=1}^N\sum_{p=1}^{\left\lfloor\dfrac{N}{j}\right\rfloor}\sum_{q=1}^{\left\lfloor\dfrac{N}{j}\right\rfloor}[gcd(i,j)=1][gcd(p,q)=1] \]
方法1:
\[\begin{aligned} ans & = \sum_{i=1}^N\sum_{j=1}^N\sum_{p=1}^{\left\lfloor\dfrac{N}{j}\right\rfloor}\sum_{q=1}^{\left\lfloor\dfrac{N}{j}\right\rfloor}[gcd(i,j)=1][gcd(p,q)=1] \\ & = \sum_{i=1}^{N}\sum_{j=1}^N\sum_{p=1}^{N}\sum_{q=1}^N[gcd(i,j)=1][gcd(p,q)=j] \\ & = \sum_{i=1}^N\sum_{p=1}^{N}\sum_{q=1}^N[gcd(i,p,q)=1] \\ & = \sum_{d=1}^N\mu(d)\left\lfloor\dfrac{N}{d}\right\rfloor^3 \end{aligned} \]
方法2:
\[\begin{aligned} ans & =\sum_{i=1}^{N}\sum_{j=1}^N(\sum_{d|gcd(i,j)}\mu(d))(\sum_{p=1}^{\left\lfloor\dfrac{N}{j}\right\rfloor}\sum_{q=1}^{\left\lfloor\dfrac{N}{j}\right\rfloor}\sum_{t|gcd(p,q)}\mu(t)) \\ & =\sum_{i=1}^{N}\sum_{j=1}^N(\sum_{d|gcd(i,j)}\mu(d))(\sum_{t=1}^{\left\lfloor\dfrac{N}{j}\right\rfloor}\mu(t)\left\lfloor\dfrac{N}{jt}\right\rfloor^2) \\ & =\sum_{d=1}^N\mu(d)\left\lfloor\dfrac{N}{d}\right\rfloor\sum_{j=1}^{\left\lfloor\dfrac{N}{d}\right\rfloor}1\cdot\sum_{t=1}^{\left\lfloor\dfrac{N}{d}\right\rfloor}\left\lfloor\dfrac{N}{dt}\right\rfloor^2\sum_{g|t}\mu(t) \\ & =\sum_{d=1}^N\mu(d)\left\lfloor\dfrac{N}{d}\right\rfloor\sum_{j=1}^{\left\lfloor\dfrac{N}{d}\right\rfloor}1\cdot\sum_{t=1}^{\left\lfloor\dfrac{N}{d}\right\rfloor}\left\lfloor\dfrac{N}{dt}\right\rfloor^2[t=1] \\ & =\sum_{d=1}^N\mu(d)\left\lfloor\dfrac{N}{d}\right\rfloor\sum_{j=1}^{\left\lfloor\dfrac{N}{d}\right\rfloor}1\cdot\left\lfloor\dfrac{N}{d}\right\rfloor^2 \\ & =\sum_{d=1}^N\mu(d)\left\lfloor\dfrac{N}{d}\right\rfloor^3 \end{aligned} \]
然後數論分塊+杜教篩即可
#include<cstdio> #include<map> #define Starseven main #define ll long long const int N = 8e6; const ll mod = 998244353; int prime[N + 20], num; ll mu[N + 20]; bool vis[N + 20]; std::map<ll,ll> mp; void Init() { mu[1] = 1; for (int i = 2; i <= N; i++) { if(!vis[i]) { prime[++num] = i; mu[i] = -1ll; } for (int j = 1; j <= num && prime[j] * i <= N; j++) { int x = prime[j] * i; vis[x] = true; if(i % prime[j] == 0) { mu[x] = 0; break; } mu[x] = -mu[i]; } } for (int i = 1; i <= N; i++) { mu[i] += mu[i - 1]; } return ; } ll Get_sum(ll x) { if(x <= N) return mu[x]; if(mp[x]) return mp[x]; ll re = 1; for (ll l = 2, r; l <= x; l = r + 1) { r = x / (x / l); re = (re - (r - l + 1) * Get_sum(x / l)) % mod; re = (re + mod) % mod; } mp[x] = re; return re; } int Starseven(void) { ll n; read(n); Init(); ll ans = 0; for (ll l = 1, r; l <= n; l = r + 1) { ll hack = n / l; r = n / (n / l); hack = hack * hack % mod * hack % mod; ans = (ans + (Get_sum(r) - Get_sum(l - 1)) % mod * hack % mod) % mod; ans = (ans + mod) % mod; } write(ans); puts(""); return 0; }