「codeforces - 585E」 Present for Vitalik the Philatelist


description

给定序列 \(\{a\}\),现需要从中选择非空子集 \(S\) 与不属于 \(S\) 的元素 \(x\),满足 \(\gcd(x,S)=1,\gcd(S)\neq 1\),求方案数。

problem link。


solution

省去推式子的过程,得到答案为 \(\sum\mu(d)\times (s_d - n)\times (2^{s_d}-1)\),其中 \(s_d\) 表示 \(d\) 的倍数个数。

枚举 \(d\) 的倍数计算 \(s_d\) 可以做到 \(O(A\ln A)\)(调和级数),在 \(A\leq 10^7\) 的时候比较危(虽然有人过了)。

如果把质数当作维数,根据唯一分解式可以确定所有正整数的高维坐标。做个类似高维前缀和即可。

时间复杂度类似于埃氏筛,为 \(O(A\ln\ln A)\)


submission

An accepted submission.


details

关于时间复杂度为什么是 \(O(A\ln \ln A)\) 而不是 \(O(\frac{A}{\ln A}\times \ln A) = O(A)\)(虽然两者实际运行差别不大),直观来说就是素数分布并不是均匀的,严格证明我也不会。


update in 2021/01/31:狄利克雷前缀和用于解决 \(S(n) = \sum_{d|n} f(d)\) 形式的问题。

如果给定 \(f(n)\) 和积性函数 \(g(n)\),我们还可以做 \(S(n) = \sum_{d|n}f(d)g(\frac{n}{d})\),一样按照每个质因子讨论。

这个复杂度为 \(O(\sum_{p\in prime}\sum_{k>0} \frac{n}{p^k})\),由于 \(O(\sum_{k>0}\frac{1}{p^k})=O(\frac{1}{p-1})=O(\frac{1}{p})\),因此复杂度依然为 \(O(N\ln\ln N)\)

这个东西我没有实现过,仅限于口胡。

posted @ 2020-09-09 10:03  Tiw_Air_OAO  阅读(524)  评论(0编辑  收藏  举报