点
计算两个都不包含圆心的方案和一个不包含一个任意的方案。
包含圆心等价于凸包上两个相邻的点之间的距离 \(\le \dfrac{L}2\) 。枚举 \(1\sim n\) 中某个点并让其作为长度 \(>\frac{L}2\) 线段的端点。在线段上的点只能选另一个颜色,剩下的可以任选,得到点数之后可以快速幂
对于后半部分,枚举两个相邻异色点作为断环成链的两个端点。从左端点右端点分别延伸出长度为 \(\frac{L}2\) 的线段,有交则中间部分快速幂。但是这会算重,不过重复的情况都存在分界线,方案数减去分界线数量即可
列
分治,将 \(> mid\) 的数字视为 \(1\),否则视为 \(0\)。那么每一层的目标就是将所有 \(1\) 翻到 \(0\) 右边
将连续的 \(0/1\) 缩成一个,再将每对 \(01\) 视作一段进行一次操作,操作过后再将连续 \(0/1\) 缩起来,段数减半。那么操作次数是 \(\Theta(\log)\) 级别
当区间不为 \([1,n]\) 时可以并行处理,于是每层操作 \(\Theta(\log)\) 次,一共 \(\Theta(\log)\) 层,由于层数增加时区间长度减小,于是实际上附带了 \(\dfrac{1}2\) 的常数
对于可能因为翻转产生的 \(1\) 实际上在 \(0\) 右边的情况可以在输出答案的时候将操作序列 \(D_1,\dots D_k\) 翻转。
实现每层的处理时不必拘泥于模拟上面所说,可以再进行一次分治,每个区间返回区间内 \(1\) 的数量并将区间里面的 \(0\) 翻到 \(1\) 的左侧,合并两个区间只需要翻转 \(0101\) 中间的一对
树
定义乘法为狄利克雷卷积,并令 \(p(x)=[\exists i,a_i|x]\) 于是可以得到根权值为 \(n\) 的树的数量 \(f(n)\) 的转移表达式
注意到非叶子节点本身没有权值,于是可以做些简单和式变换得到:
整道题的答案就是 \(f\) 前缀和的第 \(n\) 项,尝试使用定义式 \(\displaystyle\sum_{i=1}^n (f^2+p)_S(i)(1+p)^{-1}_S(\lfloor\dfrac{n}i\rfloor)\) 来求,左式的 \(f_S(i)\) 表示前缀和第 \(i\) 项。
\(p_S(n)\) 可以通过 \(2^m\) 的 Venn 图容斥来求一项,注意每个集合的倍数数量的整除除数是集合元素 \(\rm LCM\)
对于 \((1+p)^{-1}_S\) 使用标准杜教筛来处理,因为 \((1+p)^{-1}*(1+p)=\epsilon\) 。根据定义式这都是成立的,即使 \(1+p\) 并不是传统意义上的积性函数。不过给 \(p\) 附加常数项好像并没有对指数上的运算产生任何影响,我不是很理解。
对于 \(f^2_S(n)\) 也是用 \(\displaystyle\sum_{i=1}^n f_S(i)f_S(\lfloor\dfrac{n}i\rfloor)\) 来做,乍一看出现了环形转移,但是 \(a_i\ge 2 \Rightarrow f_S(1)=0\) 所以不必担心。
按照定义式 \(\Theta(n\log n)\) 求出来上述函数的前缀和,其中狄利克雷卷积的逆运算表达式为 \(\displaystyle g(n)=\dfrac{\epsilon(n)-\sum\limits_{d|n\land d\neq 1}f(d)g(\frac{n}d)}{f(1)}\)
时间复杂度 \(\displaystyle \Theta((n\log n)^{\frac{2}3})\)