Loading

一些奇怪的题的题解

1

  • 给定 \(n\),求:

\[\sum_{i=1}^n\sum_{j=1}^n\frac{i+j}{\gcd(i,j)} \]

  • 思路分析:

先化式子:

\[\begin{aligned} \sum_{i=1}^n\sum_{j=1}^n\frac{i+j}{\gcd(i,j)}&= \sum_{d=1}^n\sum_{i=1}^n\sum_{j=1}^n\frac{i+j}{d}[\gcd(i,j)=d]\\&= \sum_{d=1}^n\sum_{i=1}^{\left\lfloor\frac{n}{d}\right\rfloor}\sum_{j=1}^{\left\lfloor\frac{n}{d}\right\rfloor}(i+j)[\gcd(i,j)=1]\\&= \sum_{d=1}^n\sum_{i=1}^{\left\lfloor\frac{n}{d}\right\rfloor}\sum_{j=1}^{\left\lfloor\frac{n}{d}\right\rfloor}(i+j)\sum_{x=1}^{\left\lfloor\frac{n}{d}\right\rfloor}\mu(x)[x|i][x|j]\\&= \sum_{d=1}^n\sum_{x=1}^{\left\lfloor\frac{n}{d}\right\rfloor}\mu(x)x\sum_{i=1}^{\left\lfloor\frac{n}{xd}\right\rfloor}\sum_{j=1}^{\left\lfloor\frac{n}{xd}\right\rfloor}(i+j) \end{aligned}\]

有一个性质:

\[\boxed{\sum_{i=1}^n\sum_{j=1}^n(i+j)=n^2(n+1)} \]

故上式可化为:

\[\sum_{d=1}^n\sum_{x=1}^{\left\lfloor\frac{n}{d}\right\rfloor}\mu(x)x\left\lfloor\frac{n}{xd}\right\rfloor^2(\left\lfloor\frac{n}{xd}\right\rfloor+1) \]

套路的设 \(T=xd\),有:

\[\sum_{T=1}^n\sum_{d|T}\mu(d)d\left\lfloor\frac{n}{T}\right\rfloor^2(\left\lfloor\frac{n}{T}\right\rfloor+1) \]

\(f(n)=\sum\limits_{d|n}\mu(d)d\),我们发现一个神奇的性质:\(\boxed{f*\varphi=\epsilon}\),即 \(f\)\(\varphi\) 的逆元,那么 \(f\) 的前缀和就容易用杜教筛筛出。再套上一层整除分块,时间复杂度为 \(O(n^{\frac{2}{3}})\)

2

  • 给定长度为 \(n\) 的序列 \(a\),求:

\[\sum_{i=1}^n\sum_{j=1}^n\sum_{k=1}^n\max(a_i,a_j,a_k) \]

  • 思路分析:

首先可以发现将 \(a\) 以任意顺序排列均不影响所求值,那么我们不妨先将 \(a\) 从小到大排序。

我们观察在 \(i\) 固定时随着 \(j\) 的变化所产生的贡献总和,容易发现,当 \(i,j\) 固定时,由 \(k\) 产生贡献为:

\[\max(i,j)\max(a_i,a_j)+\sum_{k=\max(i,j)+1}^n a_k \]

进一步的,考虑固定 \(i\),同时观察 \(j,k\) 的变化,可以得到:

\[\sum_{j=1}^n\sum_{k=1}^n\max(a_i,a_j,a_k)=i\times(ia_i+\sum_{j=i+1}^na_j)+\sum_{j=i+1}^nja_j+\sum_{j=i+1}^n\sum_{k=j+1}^na_k \]

这个式子可以通过预处理 \(\sum\limits_{i=1}^n a_i\)\(\sum\limits_{i=1}^n i\times a_i\)\(\sum\limits_{i=x}^n\sum\limits_{j=i+1}^n a_j\) 做到 \(O(1)\) 计算。

这样我们就可以 \(O(n\log n)\) 做完了。

3

  • 给定 \(n\) 个集合,集合元素个数和为 \(m\),进行 \(q\) 次询问,每次询问两个集合交集的元素个数。

  • 思路分析:

首先想到 bitset,我们对于每个集合开一个 bitset,询问时只需要将两个 bitset 与一下就可以了。

但这样空间复杂度会炸掉,因此我们考虑根号分治平衡时空复杂度。

具体的说,我们设定一个阈值 \(B\),只对 \(|S|>B\) 的集合 \(S\) 预先开好 bitset,查询时将小于 \(B\) 的集合放入一个公用的 bitset 中再与另一个 bitset 与,再把公用的 bitset 清空。

这样做的时间复杂度为 \(O(\frac{mq}{w}+qB)\),空间复杂度为 \(O(\frac{m^2}{B})\),时空都可以接受。

posted @ 2023-08-29 19:09  TKXZ133  阅读(74)  评论(0)    收藏  举报