欧拉函数学习笔记
Preface
复习数论的时候发现原来好像原来学过的全忘了,于是重新学习了一下,并记录如下。
欧拉函数
欧拉函数 φ(n)\varphi(n)φ(n) 表示小于等于 nnn 的正整数中与 nnn 互质的数的个数。
性质
欧拉函数是一个积性函数,即对于互质的两个数 mmm 和 nnn ,有 φ(m×n)=φ(m)×φ(n)\varphi(m \times n) = \varphi(m) \times \varphi(n)φ(m×n)=φ(m)×φ(n) ,容易通过唯一分解定理证明。
这给我们提供了很多很好的性质。
φ(1)=1\varphi(1) = 1φ(1)=1
φ(p)=p−1\varphi(p) = p - 1φ(p)=p−1 (ppp 为质数)
φ(pk)=pk−pk−1\varphi(p^k) = p^k - p^{k - 1}φ(pk)=pk−pk−1 (ppp 为质数)
φ(m×n)=φ(m)×φ(n)\varphi(m \times n) = \varphi(m) \times \varphi(n)φ(m×n)=φ(m)×φ(n) (mmm 和 nnn 互质)
φ(n ...
求数组任意元素右边第 k 个比它小的元素
Preface
补 Codeforces Round 958 (Div. 2) E 题时,需要求得一个数组任意元素左右第 111 和第 222 个比它小的元素。
研究了 Jiangly 的写法,得到一个通用的解法,记录如下。
问题引入
我们都知道,如果我们想求得一个数组任意元素左边或右边的第一个比他大或小的元素,可以通过单调栈实现,时间和空间复杂度都是 O(n)O(n)O(n) 。但是如果我们想求得一个数组任意元素左边或右边的第 kkk 个比他大或小的元素,该怎么办呢?
解决思路
线段树 + 二分(线段树上二分优化)
我们考虑使用线段树来解决这个问题。我们可以用线段树来维护区间最小值,然后通过二分查找来找到第 iii 个比他小或大的元素的位置,共 kkk 次二分查找,时间复杂度为 O(nklog2n)O(nk\log^2 n)O(nklog2n) 。
考虑线段树上二分优化,可以消去一层二分,时间复杂度为 O(nklogn)O(nk\log n)O(nklogn) 。
这样,我们就得到了时间复杂度为 O(nklogn)O(nk\log n)O(nklogn) 的解法。
但是这种解法 ...
Ciallo~(∠・ω< ) World!
Ciallo~(∠・ω< ) World!