loj6686 - Stupid GCD 题解

\(n\leq 10^{30}\),又是三次根,很容易想到枚举三次根然后杜教筛啥的?考虑枚举三次根,那么满足三次根等于它的 \(i\) 显然是一个区间,转化为前缀和,等价地就是要求对 \(r,c\)\(\sum\limits_{i=1}^r\gcd(i,c)\)。这个好久没推莫反了,写个过程:

\[\begin{aligned}ans&=\sum_{j\mid c}j\sum_{i=1}^{\left\lfloor\frac rj\right\rfloor}\left[\gcd\!\left(i,\dfrac cj\right)=1\right]\\ &=\sum_{j\mid c}j\sum_{i=1}^{\left\lfloor\frac rj\right\rfloor}\sum_{k\mid i,k\mid \frac cj}\mu(k)\\ &=\sum_{j\mid c}j\sum_{k\mid \frac cj}\mu(k)\left\lfloor\dfrac r{jk}\right\rfloor\\ &=\sum_{o\mid c}\left\lfloor\dfrac ro\right\rfloor\sum_{j\mid o}j\mu\!\left(\dfrac oj\right)\\ &=\sum_{o\mid c}\left\lfloor\dfrac ro\right\rfloor\varphi(o) \end{aligned} \]

这东西带个整除,并不能化成积性函数之类的样子,或者说连 \(\sum\) 都去不掉。那么前面再套个 \(\sum\) 枚举 \(10^{10}\) 个哪儿吃得消?

但是我们看,对 \(c=i\),要求的两个 \(r_1=(i+1)^3-1,r_2=i^3-1\)\(r_1=i^3+3i^2+3i+1-1=i^3+3i^2+3i\),恰好是 \(i\) 的倍数,而 \(o\mid i\),所以 \(\dfrac ro\) 是个整数,整除号可以直接去掉。就变成了

\[\sum_{o\mid i}\dfrac{i^3+3i^2+3i}o\varphi(o) \]

每项单独拿出来,以三方项为例:

\[\sum_{o\mid i}\dfrac{i^3}o\varphi(o)=i^2\sum_{o\mid i}\dfrac io\varphi(o)=(\mathrm{id}_2\times(\mathrm{id}*\varphi))(i) \]

这样就是个积性函数的形式了(平方和一次项的系数 \(3\) 可以根据 \(\sum\) 线性性拆出来,然后类似),你暴力 min25 我不拦你,然而它是可杜教筛的,这个下面讲。现在来看看 \(r_2\) 怎么破,它并不是 \(i\) 的倍数。但是发现 \(i^3\)\(i\) 的倍数,而再减去个 \(1\),小学二年级学生都知道 \(\left\lfloor\dfrac{i^3-1}o\right\rfloor=\dfrac{i^3}o-1\)。前者照样搞,后者的话就是个

\[\sum_{o\mid i}\varphi(o)=i \]

前缀和的话贼几把简单。

下面我们来考虑 \(\mathrm{id_?}\times(\mathrm{id}*\varphi)\) 怎么杜教筛。\(\mathrm{id_?}\) 是完全积性,可以提公因式,于是我们只需要杜教筛 \(\mathrm{id}*\varphi\)。有 \(\varphi\),给它卷上个 \(1\) 得到 \((\mathrm{id}*\varphi)*1=\mathrm{id}*\mathrm{id}\)。稍微想一下发现等于 \(\mathrm{id}\times \mathrm d\)。把公因式搞进去得到 \((\mathrm{id}_?\times(\mathrm{id}*\varphi))*\mathrm{id}_?=\mathrm{id}_{?+1}\times\mathrm d\)\(\mathrm{id}_?\) 对低次显然是有前缀和通项的,那么 RHS 这玩意可杜教筛吗?稍微推推:

\[\sum\limits_{i=1}^ni^x\sum_{j\mid i}1=\sum_j j^xf\!\left(\left\lfloor\dfrac nj\right\rfloor\right) \]

其中 \(f\)\(\mathrm{id}_x\) 的前缀和。那么显然可以整除分块根号算出来。根据杜教筛复杂度分析,只需要预处理然后即可做到 2/3 方复杂度,所以是可杜教筛的。那么一大部分就做出来了。(其实根本就不用对三方项做,因为前缀和抵掉了,wtm 还傻乎乎的也求了出来)

还有一个 van tea:\(r_2\) 实际上等于 \(\min\!\left(n,i^3-1\right)\)。但注意到仅对最大的那个需要考虑,于是单独按照 \(\sum\limits_{o\mid c}\left\lfloor\dfrac ro\right\rfloor\varphi(o)\) 来算。直接枚举因数是根号的,但是还要考虑到对很大的数求单点 \(\varphi\) 值的问题。直接分解质因数求单点值的话单点是根号的,根据杜教筛复杂度分析是 3/4 方的(虽然杜教筛是整除分块关键点,而此处是因数除法,但是由于杜教筛复杂度分析的时候本来就是用连续情况去近似,所以是一样的),预处理可到 2/3 方。

于是这题就做完了,好毒瘤一题。常数巨大,但 loj 神机还是让我过了。代码巨丑:code

posted @ 2021-04-15 22:35  ycx060617  阅读(105)  评论(0编辑  收藏  举报