杂题汇总 【一】

整理一些有趣的题,预计是 $10$ 道题整理一篇


 【一】

设 $f_{0}=0,f_{1}=1,f_{i}=f_{i-1}+f_{i-2}(i \ge 2)$,求 $f_{f_{n}} \bmod (10^9+7)$

$1 \le n \le 10^{100}$

先放一篇文章:The Period of the Fibonacci Sequence Modulo j

(直接摘抄题解了)

可以观察到:

$$
\begin{aligned}
f_{x} &\equiv f_{x \bmod (2 \times 10^9+16)} \pmod {10^9+7} \\
f_{x} &\equiv f_{x \bmod 329616} \pmod {2 \times 2 \times 10^9+16}
\end{aligned}
$$

然后只需要把输入的 $n$ 先对 $329616$ 取模,然后计算 $f_{n}$ 模 $2 \times 10^9+16$ 的值,然后在把这个值求一次 $f_{n}$ 即可

时间复杂度是 $O(\log n)$ 的

在模意义下 $fib$ 是存在循环节的

由于 $\lim_{n \to \infty} \frac{fib_{n}}{fib_{n-1}}=\phi(n)$,此时 $\forall fib_{n}$,$fib_{n+1}$ 只有常数个取值(视 $n$ 和 $mod$ 的大小而定,这里取 $2$)

于是总的数对只有 $2 \cdot mod$ 个,即循环节小于 $n+2 \cdot mod$,再用矩阵表示 $fib$,这样就可以用 $BSGS$ 求出循环节了

还可以证明循环节小于 $6 \cdot mod$

记模 $M$ 意义下的循环节为 $P(M)$,关于 $P(M)$ 有一些结论:

1. $P(M)$ 一定存在
2. $P(2^t) \le 3 \times 2^{t-1}$
3. $P(5^t) \le 4 \times 5^t$
4. $P(p^t) \le 2(p+1)p^t,p \ne 2,5$
5. 设 $M=\prod p_i^{t_i}$,有 $P(M)=\text{lcm}(P(p_i^{t_i}))$

合并后可以得到:$P(M) \le 6M$

 


 【二】

有 $n$ 个除了颜色外完全相同的小球,定义一次操作的效果是重新排列第 $l_i$ 到第 $r_i$ 个小球

现在已知起始序列和目标序列,同时按照时间顺序给定 $m$ 个 $l_i,r_i$,求是否可以从起始序列变成目标序列

$n,m \le 1000$

这题有毒……猜了个假的算法居然有 $60pts$……

考虑这么一个性质:对于同种颜色,无论如何排列,都可以保证在任意时刻相对顺序不变

然后就做完了,每个颜色按照相对顺序是对应着目标序列的唯一一个标号,那么操作就相当于区间排序,最后判断是否每个位置上是对应位置下标的数就行了

通过线段树合并可以做到 $O(n \log n)$


 【三】

bzoj 3942  bzoj 3940

给定一个长度为 $n(n \le 10^5)$ 的字符串,以及 $m(m \le 10^5)$ 个模板串,每次会在原串中从前往后找到第一个出现过的模板串,然后删掉这个子串,之后再从头开始查找,直到不存在为止

求最后剩下的字符串是什么

AC自动机直接暴力……用栈记录一下当前在哪个节点,以及它是由哪个字符转移过来的,遇到一个终止节点就直接弹相应长度的栈,然后做完了……


 

【四】

ZOJ 4053

给出 $a_{1} \sim a_{n}$,共 $n( n \le 10^5)$ 次操作,每次删除一个位置 $p_i$,此时区间会变为两个分离的区间,求每次操作的最大区间逆序对(强制在线)

和某次模拟赛的题一模一样

一个思维简单代码简单的想法:

启发式分裂区间,原区间的贡献由大区间直接继承,每次把小的区间暴力删除对大区间的贡献,然后重新计算小区间的贡献

至于如何维护一大堆连续的区间,这个直接set乱搞一下就好了,具体代码可以参考:这里

然后就剩下了一个单点修改,查询区间小于等于 $x$ 的问题

如果无视掉其他条件,硬做的话直接分块维护一下就好了……但总体时间复杂度是 $O(n \log n \sqrt{n \log n})$……我不知道发生了什么反正过去了……

(当然如果用树套树实现的话是需要极其小的常数的)

如果仔细观察一下,直接对于所有连续区间分别维护个平衡树就行了,分裂的时候把小区间的所有元素暴力删除掉就好了

用线段树维护的话跑的更快一些(实际上直接 $pbds$ 就行了)


 

【五】

codeforces 482A

给定 $n,k(1 \le k < n \le 10^5)$,构造一个 $1 \sim n$ 的排列 $\{a_n\}$,使得 $|a_{i}-a_{i+1}|$ 的种类数恰好为 $k$

首先可以这么放 $1 \sim n$ 来搞出 $n-1$ 个不同的:$1,n,2,n-1,3,n-2,4,n-3,\cdots$

如果是 $k$ 个的话,就把后面的一部分进行排序就行了,具体来说,如果 $k$ 是奇数,那么把 $a_{k} \sim a_{n}$ 升序排列,反之降序排列


 

【六】

codeforces 743C

给定 $n(1 \le n \le 10^4)$,求一组互异的正整数 $x,y,z$,满足 $\frac{2}{n}=\frac{1}{x}+\frac{1}{y} + \frac{1}{z}$

当 $n=1$ 的时候无解,否则可以令 $x=n$,那么只需要 $\frac{1}{y}+\frac{1}{z}=\frac{1}{n}$ 就行了,一组合法的解是 $y=n+1,z=n(n+1)$


 

【七】

bzoj 4236

给定一个长度为 $n(n \le 10^5)$ 的只包含三种字符 $J,O,I$ 的字符串,求一个最长的子串,满足三种字符的数量相等

似曾相识……某次模拟赛就这个题……

首先求三个前缀和数组 $J,O,I$,分别表示出现了多少个对应字符,考虑要满足的条件:

$$J_i-J_j=O_i-O_j=I_i-I_j$$

移项可得:

$$J_i-O_i=J_j-O_j,J_i-I_i=J_j-I_j$$

然后用 $map$ 记录一下就好了


 

 

【八】

蒜头是一名优秀的画家。

蒜头有一张长度为 $n$ 的画卷,在位置 $i$ 上画图案会获得 $a_i$ 的美观度。

蒜头是一个有追求的人,因此他希望他的画从左往右是越来越美观的,即对于任意两个画了图案的格子 $l < r$,有 $a_l \le a_r$。

但蒜头发现,人们评判画卷的好坏,并不会只从画出的图案来考虑。

具体来说,一张画卷的美观度,定义为所有画了图案的位置的美观度之和与在图上选择两个可以重复的位置使得两位置之间不存在画了图案的位置的方案数之差。

现在,蒜头想要知道,他画出的画卷的最大美观度是多少。

形式化地,一段连续的长度为 $m$ 的空白位置会让美观度降低 $\frac{m(m+1)}{2}$ 。

$1 \le n \le 10^6,|a_i| \le 10^8$

有一个比较显然的 $dp$ 式子:

$$f_i=\max_{j < i, a_j \le a_i}f_j+a_i+\frac{(i-j)(i-j-1)}{2}=a_i-\frac{i^2-i}{2}+\max_{j < i, a_j \le a_i} f_j-\frac{j^2+j}{2}+ij$$

然后可以先把 $a$ 离散化后,建一棵线段树,然后由于 $i,j$ 单调,可以在每个节点上开单调队列跑斜率优化

然而这个常数有点大,可能需要卡常

考虑另一个思路:把 $a_j \le a_i$ 的限制去掉,这样就成了普通的斜率优化形式

可以先把 $1 \sim n$ 按照 $a$ 排序,之后 $cdq$ 分治,这样就只剩下 $j < i$ 的限制了,而且这个插入的新点和查询的斜率都是单调的,可以线性的斜率优化

 


 

【九】

uoj 48

设 $sgcd(a,b)$ 表示 $a,b$ 的次大公约数,不存在则为 $-1$,给定 $n(n \le 10^6)$ 个数,求 $sgcd(a_1,a_i) (1 \le i \le n)$,其中 $a_i \le 10^{12}$

考虑最大公约数的定义:$gcd(a,b)=\prod p_i^{min(t_{a_i},t_{b_i})}$

次大公约数就是最大公约数除以一个最大公约数的质因数,于是可以把 $a_1$ 质因数分解,然后从小到大依次枚举质因子

因为 $2^{\Omega(a)} \le 2^{log(a)}$,所以该算法的时间复杂度为 $O(\sqrt a+n \log a)$


 

【十】

uoj 31

给定一个长度为 $2n(n \le 10^5)$ 的括号序列,保证左右括号的个数相同,每次可以选择 $(i,j)$,然后翻转这一段区间的字符顺序

构造一种至多 $n$ 次翻转的方式,使得把原先的括号序列变为合法的一个括号序列

考虑贪心,每次选择靠右的最近的一个左括号,然后替换过来,这样操作次数是最多为 $n$

也就是说翻转的时候除了两个端点,剩下的都是右括号,即翻转 $(i,j)$ 相当于 $swap(a_i,a_j)$

因此“靠右的第一个左括号”是单调往右的,用指针维护一下就好

posted @ 2019-01-12 15:15 KingSann 阅读(...) 评论(...) 编辑 收藏