小清新清新题

记录一些小清新题。。。

他改变了小清新 ——zzq传

P3653 小清新数学题

题目大意:

\[\sum_{i = l}^r \mu(i), l \le r \le 10^{18}, r - l \le 10^5 \]

考察了对于筛法的理解与扩展能力。
观察数据范围,发现 \(l,r\) 都很大,杜教筛显然会挂,而 \(r - l\) 很小,因此考虑直接筛出 \([l, r]\) 内所有的数的莫比乌斯函数。
若要筛出 \([r, l]\) 内每个数的所有质因子显然会挂,因此可以类似于 签到题 ,筛出每个数小于 \(\sqrt{r}\) 的质因子,这样每个数内没有被筛到的质因子最多只有一个,根据积性函数的性质相乘即可得到答案。
然而这题 \(r\) 太大了,仅仅是筛出 \(\sqrt{r}\) 内所有质数便已经超时了,因此考虑优化。
不难发现,若对于每个数筛出小于 \(r^{\frac{1}{3}}\) 的质因子,则每个数没有被筛到的质因子数量至多有两个,设 \(num_x\)\(x\) 没有被筛到的质因子的乘积,则 \(num_x\) 只有以下几种情况:

\[num_x = \left\{\begin{matrix} 1 \\ P \\ P^2 \\ P_1 P_2 \end{matrix}\right.\]

考虑如何判断这几种情况,若 \(num_x = P^2\) ,那么显然可以暴力开方再乘起来,较难分辨的是 \(num_x = P\)\(num_x = P_1 P_2\) 的情况,可以使用 \(Miller-Rabin\) 素性测试来判断,由于这题很难构造数据数据比较水,实际上用 \(Fermat\) 素性测试即可。

之前不会 \(Miller-Rabin\) 素性测试,这是第一次见,简单记录一下。
首先有 \(Fermat\) 素性测试,即根据费马小定理,对于任意素数 \(p\)\(x^{p-1} \equiv 1 (mod \ p)\) ,因此随便找几个 \(x\) 带入,若都满足,就判定 \(p\) 数素数。这玩意大概率是对的,即所有素数均可通过该测试,但仍有部分合数可以概率性通过。
\(Miller-Rabin\) 素性测试即是在 \(Fermat\) 素性测试的基础上加入二次探测定理。
二次探测定理:\(若 x^2 \equiv 1 (mod \ p), p 为质数 , 则一定有 x = 1 或 x = p - 1\)
证明较为简单,此处不加以赘述。
再看费马小定理的式子 \(x^{p - 1} \equiv 1(mod \ p)\) ,不难发现 \(p-1\) 可以被表示为 \(a 2^k\) ,由二次探测定理可得,若 \(p\) 为质数,则 \(\exists i \in [0, k) x^{a 2^i} \equiv 1 || p - 1 (mod \ p)\) ,因此对所有的 \(i\) 判断即可。
这玩意极大概率是正确的,目前还没有发现能通过 \(Miller-Rabin\) 素性测试的合数。

证明 \(oi-wiki\) 上都有。

P3672 小清新签到题

在小清新题里确实算是比较签到的。。。。

题目大意:

求第 \(k\) 小的逆序对数量为 \(x\)\(n\) 的排列。

乍一看这题貌似很难。。。但实际上只要看到啥写啥就可以了。。。
首先看到第 \(k\) 小,不难想到从小到大枚举每一位上的数,求这一位上放 \(i\) ,后几位上产生 \(x\) 个逆序对的方案数是多少,然后用类似数据结构中求第 \(k\) 大 \ 小的方法,若 \(k\) 比方案数小,则确定这一位为 \(i\) ,枚举下一位,反之,则令 \(k\) 减去方案数,令当前位上枚举的数加一,同时逆序对数会发生改变,考虑到若当前位上放 \(i + 1\) ,则 \(i\) 一定会出现在后面的序列中,产生一个逆序对,后面序列上的逆序对数减少,于是令 \(x = x - 1\) 即可。

于是只要求方案数就可以了,不妨设 \(f_{i, j}\) 表示长度为 \(i\) 的一个排列中,有 \(j\) 个逆序对的方案数。
转移比较套路,在此不加以赘述。
考虑到 \(f\) 可能有爆掉 \(long \ long\) 的情况,而 \(k\) 最大只有 \(10^{13}\) ,因此令 \(f_{i, j} = min(f_{i, j}, k + 1)\) 即可。

P3673 小清新计数题

神仙 \(dp\) ,本来想一定要凭自己做出一道神仙 \(dp\) ,最终还是看题解了。。。。

P3674 小清新人渣的本愿

题目大意:

给定一个长度为 \(n\) 的序列,有三种询问,分别为问区间 \(l, r\) 的是否存在两个数差 \ 和 \ 积为 \(x\)

首先看到区间操作,考虑数据结构,线段树 \ 平衡树显然不能做,于是考虑离线用莫队。

既然第一个操作为求差,那么一定最好做。
求是否有 \(\exists a, b \in [l, r] a - b = x\) ,移项得 \(\exists a, b \in [l, r] a = b + x\) ,于是可以用 \(bitset\) 维护,大力左移即可。
第二个操作为求和。
求是否有 \(\exists a, b \in [l, r] a + b = x\) ,同上移项得 \(\exists a, b \in [l, r] a = x - b\) ,考虑到不能将一个负数加入到 \(bitset\) ,于是按照套路将其加上一个极大值 \(N\) 存入 \(bitset\) ,则有 \(\exists a, b \in [l, r] a = (N - b) - (N - x)\) ,于是大力右移即可。
第三个操作是求积。
求是否有 \(\exists a, b \in [l, r] ab = x\) ,考虑到莫队本身就自带一个根号,处理操作再带一个根号也不会对复杂度产生影响,于是大力枚举即可。

P3675 小清新提交答案题

大概退役后会写。。。。。。

P3676 小清新数据结构题

题目大意:

给定一棵树,每个点有点权,有两种操作,每次操作可以更改一个点的点权,询问求以某个点为根时所有子树权值的平方和。

这题有多种做法,可以动态点分治、LCT或是树剖。然而我只会树剖和 LCT,只写了树剖。。。
首先考虑如果没有换根操作,每次询问只有以 \(1\) 为根时该怎么做。
更改一个点的点权可以被看做增加一个点的点权,假设给节点 \(u\) 增加了 \(x\) ,记节点 \(i\) 的子树和为 \(S_i\) ,则对于每个位于路径 \(1, u\) 上的点都有 \(S_i + x \rightarrow S_i\) ,则对答案的贡献为 \((S_i + x)^2 - S_i^2\) ,即 \(2S_i x + x^2\) ,那么总贡献为 \(len \ x^2 + 2 x \sum_{i \in (1, u)} S_i\) 于是统计每个点的子树和即可。

接下来考虑如何将答案从以 \(1\) 为根转移到以任意点 \(u\) 为根上,设 \(a_i\) 表示以 \(1\) 为根时每个点的子树和,设 \(b_i\) 表示以 \(u\) 为根时每个点的子树和,则有:

\[ans_u = ans_1 - \sum_{i \in (1, u)} a_i + \sum_{i \in (1, u)} b_i \]

于是大力推导,最终有

\[ans_u = ans_1 + a_1((len + 1) a_1 - 2 \sum_{i \in (1, u)} a_i) \]

于是维护每个点的子树和即可。。。
树剖 + 树状数组 \ 线段树即可。

posted @ 2022-01-12 11:32  Cyber_Tree  阅读(122)  评论(0编辑  收藏  举报