P9308 「DTOI-5」#1f1e33 题解

思路#

没有脑子怎么办,使用纯套路解决这道题。

=i=1nj=1nk=1n[i+j+k=n]lcm(i,gcd(j,k))=i=1nj=1nk=1n[i+j+k=n]d=1nlcm(i,d)[gcd(j,k)=d](枚举 gcd)=d=1ni=1nj=1ndk=1nd[i+jd+kd=n]lcm(i,d)[gcd(j,k)=1]=d=1ni=1nj=1ndk=1nd[i+jd+kd=n]lcm(i,d)p|gcd(j,k)μ(p)=d=1np=1nμ(p)j=1ndpk=1ndp[j+kndp]lcm(njdpkdp,d)

T=dp

=T=1nd|Tj=1nTk=1nT[j+knT]lcm(njTkT,d)μ(Td)=T=1nd|Tj=1nTk=1j1lcm(njT,d)μ(Td)(枚举 j+k 和 j)=T=1nd|Tμ(Td)j=1nTlcm(njT,d)(j1)=T=1nd|Tμ(Td)j=1nT(njT)d(j1)gcd(njT,d)(拆开 lcm)

注意到 d|T,所以有 gcd(njT,d)=gcd(n,d)

=T=1nd|Tμ(Td)j=1nT(njT)d(j1)gcd(n,d)=T=1nd|Tμ(Td)dj=1nT(njT)(j1)gcd(n,d)=T=1nd|Tμ(Td)dgcd(n,d)j=1nT(njT)(j1)

S(x)=1++x,S2(x)=12++x2

=T=1nd|Tμ(Td)dgcd(n,d)j=1nT(njT)(j1)=T=1nd|Tμ(Td)dgcd(n,d)j=1nTnjnj2T+jT=T=1nd|Tμ(Td)dgcd(n,d)F(n,T)

其中:

F(n,T)=nS(nT)n(nT)TS2(nT)+TS(nT)

这样的式子已经可以获得 20pts 的高分了。

=T=1nd|Tμ(Td)dgcd(n,d)F(n,T)=p=1nT=1nd|Tμ(Td)dp[gcd(n,d)=p]F(n,T)(传统艺能)=p=1n[p|n]T=1nd|T,p|dμ(Td)dp[gcd(n,d)=1]F(n,T)=p=1n[p|n]T=1nd|T,p|dμ(Td)dpk|gcd(n,d)μ(k)F(n,T)=p=1nk=1nμ(k)[pk|n]T=1nd|T,pk|dμ(Td)dpF(n,T)

H=pk

=H|nk|Hμ(k)T=1nd|T,H|dμ(Td)dpF(n,T)=H|nk|Hμ(k)T=1nHd|Tμ(THdH)dHpF(n,TH)=H|nk|Hμ(k)T=1nHd|Tμ(Td)dkF(n,TH)=H|nT=1nHF(n,TH)k|Hμ(k)d|Tμ(Td)dk=H|nT=1nHF(n,TH)k|Hμ(k)kd|Tμ(Td)d

G1(x)=d|xμ(xd)d=φ(x),G2(x)=d|xμ(x)x

=H|nT=1nHF(n,TH)k|Hμ(k)kd|Tμ(Td)d=H|nT=1nHF(n,TH)G1(T)G2(H)

这个式子就非常的简洁,可以获得 40pts 的高分了。

=H|nT=1nHF(n,TH)G1(T)G2(H)=H|nG2(H)T=1nHF(n,TH)G1(T)=H|nG2(H)T=1nH((n+TH)S(nTH)n(nTH)THS2(nTH))G1(T)=H|nG2(H)T=1nHH((nH+T)S(nTH)nH(nTH)TS2(nTH))G1(T)=H|nG2(H)HT=1nH((nH+T)S(nTH)nH(nTH)TS2(nTH))G1(T)=H|nG2(H)HG(nH)

其中:

G(n)=T=1n((n+T)S(nT)n(nT)TS2(nT))G1(T)

只需要计算 G(n) 即可。

G(n)=T=1n((n+T)S(nT)n(nT)TS2(nT))G1(T)=T=1nnφ(i)(ni)+nφ(i)S(ni)+iφ(i)S(ni)iφ(i)S2(ni)=T=1n(3(ni)23(ni))n(2(ni)32(ni))i6

容易发现,预处理 φ(i),iφ(i) 前缀和,可以使用整除分块做到 O(nn)

可以获得 60pts 的高分。

但实际上在算 1n 所有的整除分块的时候,我们有更加优秀的做法。

具体来说。

枚举 id=n/i

那么对应的 n 要满足 idni(d+1)1

这样就可以直接用前缀和计算。

至此,所有的东西都可以用最多调和计数的复杂度计算。

时间复杂度:O(nlnn)

Code#

/*
  ! 如果没有天赋,那就一直重复
  ! Created: 2024/05/24 10:38:16
*/
#include <bits/stdc++.h>
using namespace std;

#define fro(i, x, y) for (int i = (x); i <= (y); i++)
#define pre(i, x, y) for (int i = (x); i >= (y); i--)

const int N = 1e6 + 10;
const int mod = 998244353;

using i64 = long long;

int n, ct;
int vs[N], pr[N], mu[N];
i64 sm[N], fm[N], g1[N], g2[N], p1[N], p2[N], d2[N], d3[N], ans;
vector<int> to[N];

signed main() {
  ios::sync_with_stdio(0), cin.tie(0);
  cin >> n, mu[1] = 1;
  fro(i, 2, n) {
    if (!vs[i]) pr[++ct] = i, mu[i] = -1;
    for (int j = 1; j <= ct && pr[j] * i <= n; j++) {
      vs[i * pr[j]] = 1;
      if (i % pr[j] == 0) {
        mu[i * pr[j]] = 0;
        break;
      }
      mu[i * pr[j]] = -mu[i];
    }
  }
  fro(i, 1, n) {
    for (int j = i, k = 1; j <= n; j += i, k++) {
      g1[j] += i * mu[k];
      g2[j] += i * mu[i];
    }
    g1[i] = (g1[i] % mod + mod) % mod;
    g2[i] = (g2[i] % mod + mod) % mod;
    d2[i] = 1ll * i * i % mod;
    d3[i] = 1ll * i * d2[i] % mod;
  }
  fro(i, 1, n) {
    for (i64 k = 1, l = i, r = 2 * i; l <= n; l += i, r += i, k++) {
      if (r > n) r = n + 1;
      p1[l] += g1[i] * (3 * d2[k] - 3 * k);
      p1[r] -= g1[i] * (3 * d2[k] - 3 * k);
      p2[l] += g1[i] * (2 * d3[k] - 2 * k) * i;
      p2[r] -= g1[i] * (2 * d3[k] - 2 * k) * i;
    }
  }
  fro(i, 1, n) {
    p1[i] = (p1[i] + p1[i - 1]) % mod;
    p2[i] = (p2[i] + p2[i - 1]) % mod;
    sm[i] = (p1[i] * i - p2[i]) % mod;
    sm[i] = (sm[i] % mod + mod) % mod;
    sm[i] = (sm[i] * 166374059) % mod;
  }
  fro(i, 1, n) {
    for (int j = i, k = 1; j <= n; j += i, k++)
      (fm[j] += i * g2[i] % mod * sm[k]) %= mod;
    cout << fm[i] % mod << " \n"[i == n];
  }
  return 0;
}

作者:JiaY19

出处:https://www.cnblogs.com/JiaY19/p/18211108

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   JiaY19  阅读(110)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示