日记

日记

Thu Jul 03 2025
4 分钟

久蹲一定要慢起,我今天差点死在厕所。

T1 Link to T1

神秘小唐题。

T2 Link to T2

神秘小 dp。设 dpi,x,ydp_{i,x,y} 表示前 ii 轮取完剩下两个数是 x,yx,y 的最大答案,使用滚动数组优化,初始化 dpa1,a2=dpa2,a1=0dp_{a_1,a_2} = dp_{a_2,a_1} = 0,其余全是 inf-\inf。设当前的三个数是 u,v,wu,v,w,考虑转移:

做出贡献:

  • u=v=wu = v = w
    显然是贪心的取这三个数,cntcnt 加上 11 然后 continue
  • u=vv=wu=wu = v \lor v = w \lor u = w
    我们把这三个数看做 {a,a,b}\{a,a,b\},有两种方式可以做出贡献:{b,ba,a,b},{a,ca,a,b}\{b,b \mid a,a,b\},\{a,c \mid a,a,b\}。前者可以 O(1)O(1) 转移:dpa,adpb,b+1dp_{a,a} \gets dp_{b,b} + 1。后者可以枚举 cc 做到 O(n)O(n) 转移:dpb,cdpa,c+1dp_{b,c} \gets dp_{a,c} + 1
  • otherwised.\text{otherwised}.
    有三种方式可以做出贡献:{u,du,v,w},{v,vu,v,w},{w,wu,v,w}\{u,d \mid u,v,w\},\{v,v \mid u,v,w\},\{w,w \mid u,v,w\},分别表现为 dpv,wdpu,d+1,dpu,wdpv,v+1,dpu,vdpw,w+1dp_{v,w} \gets dp_{u,d} + 1,dp_{u,w} \gets dp_{v,v} + 1,dp_{u,v} \gets dp_{w,w} + 1

不做出贡献:

  • 扔掉 u,v,wu,v,w
    剩下的两个数没变,由于是滚动数组,所以不操作。
  • 扔掉 u,v,wu,v,w 的其中两个
    我们可以枚举 c,dc,d 来从 dpc,ddp_{c,d} 来转移到 dpc,d/v/wdp_{c,d/v/w},但是转移的显然是 maxd=1ndpc,d\max_{d = 1}^{n}dp_{c,d},所以我们可以通过维护 maxcc=maxd=1ndpc,dmaxc_c = \max_{d = 1}^{n}dp_{c,d} 来转移。
  • 扔掉 u,v,wu,v,w 其中一个:
    依然是枚举 c,dc,d,从 dpc,ddp_{c,d} 转移。我们可以记录一个 ansans 表示整个 dpdp 数组的最大值。

还有一个小妙招:由于转移的时候要同时更新 ansansmaxcmaxc,所以对于 dpx,yzdp_{x,y} \gets z,可以通过一个 vector<array<int,3>> 来记录 {x,y,z}\{x,y,z\},之后一起转移,复杂度 O(n2)O(n^2)

T3 Link to T3

dpl,r,ddp_{l,r,d} 表示在左边界为 ll,右边界为 rr,下边界为 dd 的时候的最小(就是最上)的上边界在哪里。显然有 ans=maxl=1mmaxr=1mmaxd=1n(rl+1)×(ddpl,r,d)ans = \max_{l = 1}^{m}\max_{r = 1}^{m}\max_{d = 1}^{n} (r - l + 1) \times (d - dp_{l,r,d})

考虑如何转移。我们发现一个 [l,r][l,r] 区间非法,当且仅当 [l+1,r][l + 1,r] 非法或者 [l,r1][l,r - 1] 非法或者 l,rl,r 这两列合起来非法。那么转移有 dpl,r,d=max(dpl+1,r,d,dpl,r1,d,fl,r,d)dp_{l,r,d} = \max(dp_{l + 1,r,d},dp_{l,r - 1,d},f_{l,r,d})。其中 fl,r,df_{l,r,d} 表示在下边界为 dd 时只看 l,rl,r 两列能延伸到哪,复杂度 O(n3)O(n^3)

T4 Link to T4

没改。

GCD Link to

我们直接开始推柿子:

ans=i=1nj=1ngcd(i,j)k=2i=1nj=1igcd(i,j)ki=1ngcd(i,i)k=2d=1ndki=1ndj=1i[gcd(i,j)=1]i=1nik=2d=1ndki=1ndφ(i)i=1nik\begin{aligned} ans & = \sum_{i = 1}^{n}\sum_{j = 1}^{n}\gcd(i,j)^k \\ & = 2\sum_{i = 1}^{n}\sum_{j = 1}^{i}\gcd(i,j)^k - \sum_{i = 1}^{n}\gcd(i,i)^k \\ & = 2\sum_{d = 1}^{n}d^k\sum_{i = 1}^{\lfloor \frac{n}{d} \rfloor}\sum_{j = 1}^{i}[\gcd(i,j) = 1] - \sum_{i = 1}^{n}i^k \\ & = 2\sum_{d = 1}^{n}d^k\sum_{i = 1}^{\lfloor \frac{n}{d} \rfloor}\varphi(i) - \sum_{i = 1}^{n}i^k \end{aligned}

sum(n,k)=i=0niksum(n,k) = \sum_{i = 0}^{n}i^k,我们有神秘小公式:sumn,k=(n+1)k+1j=0k1(k+1j)sum(n,j)k+1sum_{n,k} = \frac{(n + 1)^{k + 1} - \sum_{j = 0}^{k - 1}\binom{k + 1}{j}sum(n,j)}{k + 1},可以在 O(k2)O(k^2) 的复杂度内求出 i=1nik\sum_{i = 1}^{n}i^k,对于 k5k \le 5 完全够用。然后我们就可以数论分块了 + 杜教筛了,时间复杂度 O(能过)O(\text{能过})

后日谈 Link to 后日谈

为啥你不会骗分?