早上把 11.8 题解写了。然后做了一道可爱的树状数组+并查集题目。
我永远喜欢珂朵莉~ ∣ Ynoi2013 大学
把二分,树状数组,除法,并查集的性质有机结合了,思路真的很巧妙,但是后者卡常,搞了好久。
每个数最多只能被除 loga 次。所以共有 nloga 次生效的除法操作。
再用树状数组维护,复杂度 O(nlogalogn)。现在的复杂度瓶颈在于如何快速找到数字并删除。将每个数分解质因数,将同约数的数的下标存到 vector 里。
每次除 x 的时候,lower_bound 找到左边界。然后开始除,每次除完再检查是否仍可以存在该集合里。如果不行就删除,用 erase 会超时。可以再用并查集维护,开始父亲是自己,每次找下一个点的根。
这样写的好处在于,可以实现快速的删除。只需要将该节点的父亲指向下个节点,下次访问就会直接找到目标节点。
设 x 为 ai 的约数集合个数。复杂度为 O(nxα(n)+nlogalogn)。
晚上写了两道数学题:
反素数 ∣ 一道水题II
与质数的性质有关。
反素数有以下的性质:
设分解质因数后为:
X=p1c1×p2c2…pncn
会发现 p 是连续的质数,并且 c 不上升。证明:如果 pi<pj,cj>ci。那么交换 ci,cj 很明显更优秀。
因为 2×3×5×7×11×13×17×19×23×29>2×109。
所以直接搜索这十个质数的个数即可。每次取最大的因数个数,相同时取更小的数即可通过。
后题其实是求 lcm(1…n)。
因为最小公倍数的性质,设
Xk=p1c1×p2c2…pkck
设 di=k=1maxn{ci}。即对每个质数的指数取最大值。
lcm(1…n)=i=1∏ndi
观察样例发现,每个质数不超过 n 的乘方才会贡献。感性理解一下,如果有多种质因数,那么每个的个数 ≤ 只包含一种的。
所以筛一下质数就好了。