首页 > 其他分享 >20230801 数论基础学习笔记

20230801 数论基础学习笔记

时间:2023-08-01 20:13:19浏览次数:42  
标签:lfloor le 数论 dfrac sum 笔记 20230801 rfloor left

理论基础

中国剩余定理及拓展

已知 \(x \equiv a_i (\bmod p_i\ )\),求 \(x \bmod \operatorname{lcm}\{p_i\}\) 的值。

  • 若 \(p_i\) 互质,那么我们只需要计算 \(c_i\) 使得

    \[\prod\limits_{j \ne i} \cdot c_i \bmod p_i = 1 \]

    然后有

    \[x = \sum\limits_{i}c_ia_i\prod\limits_{j\ne i}p_j \bmod (\prod p_i) \]

  • 若 \(p_i\) 不互质,我们考虑如何合并两个方程。设

    \[x = p_1c_1 + a_1 = p_2c_2 + a_2 \]

    则有

    \[p_1c_1-p_2c_2=a_2-a_2 \]

    可以直接 \(\text{exgcd}\) 求出一组可行的 \(c_1, c_2\),就能得到 \(x \bmod \operatorname{lcm}(p_1, p_2)\)。

Miller-Rabin 算法

费马小定理:如果 \(p\) 是素数,则 \(\forall 1 \le x < p, x^{p-1} \equiv 1 (\bmod p\ )\)。

考虑逆否定理,如果存在一些 \(x\) 使得 \(x^{p-1} \not\equiv 1(\bmod p\ )\) 则 \(p\) 一定不是质数。于是我们随机一些 \(x\) 来判定。

二次探测定理:在 \(p\) 是质数的情况下,如果 \(x^2 \equiv 1 (\bmod p\ )\),那么 \(x \equiv 1(\bmod p\ )\) 或 \(x \equiv p-1(\bmod p\ )\)。

于是我们将 \(p\) 分解为 \(q \cdot 2^k + 1\) 后可以先算出 \(y = x^q\),然后每次 \(y \leftarrow y^2\),用二次探测定理判定。

如果我们随机 \(c\) 个 \(x\),正确率为 \(1 - 4^{-c}\)。

Pollard-Rho 算法

假设 \(a\) 是合数,如何将它分解为 \(x \times y\) 的形式,其中 \(x, y > 1\)。

设 \(f(x) = (x^2 + c) \bmod a\) ,其中 \(c\) 是随机选的一个常数,然后我们可以进行以下过程:

  1. 随意指定初始值 \(x, y\),其中 \(x = y\) 。
  2. 每次 \(x \leftarrow f(x), y \leftarrow f(f(y))\) 直到操作后 \(\gcd(x - y, a) \ne 1\) 或者 \(x = y\) 为止。
  3. 如果是前者,则分解成功了,否则分解失败,重新选择 \(c, x\) 开始。

这个套圈的过程我们可以通过倍增把算 \(\gcd\) 的 \(\log\) 优化掉。

如果认为 \(f\) 是一个随机映射,则根据生日悖论,期望时间复杂度为 \(\mathcal O(\sqrt{p})\) 即 \(\mathcal O(n^{\frac14})\) 。

Lucas 定理

对于素数 \(p\) ,有

\[\binom{n}{m} = \binom{\lfloor\frac np\rfloor}{\lfloor\frac mp\rfloor} \binom{n \bmod p}{m \bmod p} (\bmod p\ ) \]

证明考虑 \((1+x)^p = 1 + x^p\) 。可以写出阶乘因子后先数出 \(p\) 的因子个数,然后对于 \(p\) 的倍数,非 \(p\) 的倍数部分分开计算。

拓展 Lucas 定理

对于 \(p\) 不是素数的情况,首先可以拆成质数幂然后 CRT 合并。

对于质数幂的情况,我们可以先计算 \(p\) 的指数,然后用类似的方法计算去掉所有 \(p\) 因子之后 \(n! \bmod p^k\) 的值。

欧拉筛

线性求 \(f(1), f(2), \ldots, f(n)\) 。其中 \(f\) 是积性函数,且可以在 \(\mathcal O(1)\) 时间内计算 \(f(p^k)\)。

杜教筛

求 \(\sum\limits_{i \le n} f(i)\) 。我们可以找到 \(g, s\) 使得 \(g * f = s\) 且 \(g, s\) 前缀和都容易计算,同时 \(g(1) = 1\) 。

令 \(F, G, S\) 分别是 $f, g,s $ 的前缀和,则

\[\begin{aligned} S(n) &=\sum_{d | n} f(d)g(\dfrac nd)\\ F(n) &= \sum_{i=1}^n(s(i) - \sum_{j|i,j\ne i}f(j)g(\dfrac ij))\\ &= S(n) - \sum_{k=2}^n\sum_{j=1}^{n//k}g(k)f(j)\\ &= S(n) - \sum_{k=2}^n g(k)F(n//k) \end{aligned} \]

可以对其进行整除分块然后递归,存进一个哈希表,直接这样算时间复杂度 \(\mathcal O(n^{\frac34})\),预处理前 \(\mathcal O(n^\frac23)\) 复杂度就是 \(\mathcal O(n^\frac23)\) 了。

求所有 \(f(\lfloor\frac ni\rfloor)\)

\[\begin{cases} f_1(i) = f(i)&\ i \le \sqrt n\\ f_2(i) = f(\lfloor\frac ni\rfloor) &\ i > \sqrt n \end{cases} \]

Powerful Number 筛

定义 Powerful Number 为所有满足所有质因子指数都 \(> 1\) 的数,可以证明这样的数不超过 $\mathcal O(\sqrt n) $ 个,且一定可以表示为 \(a^2b^3\)、

假设我们能构造出一个积性函数 \(g\) 使得 \(g(p) = f(p)\),且 \(g\) 的前缀和易求,令 \(h\) 满足 \(h * g = f\) ,则有 \(h\) 只在 Powerful Number 处不为 \(0\)。从而有:

\[\begin{aligned} F(n) &= \sum_{i=1}^nf(i)\\ &= \sum_{i=1}^n\sum_{j|i}h(j)g(\dfrac ij)\\ &= \sum_{i=1}^n h(j)G(\lfloor\dfrac nj \rfloor) \end{aligned} \]

于是我们枚举 Powerful Number 然后计算即可。

Min_25 筛

要求:\(f(p)\) 是一个关于 \(p\) 项数较少的多项式,\(f(p^c)\) 可以快速计算。

我们考虑记一个 \(F(n, k)\) 表示 \(n\) 以内最小质因子 \(\ge k\) 的数 \(x\) 的 \(f(x)\) 和,记 \(G(n)\) 为 \(n\) 以内质数位置 \(f(x)\) 和,则:

\[\begin{aligned} F(n, k)=\sum_{i=2}^n \end{aligned} \]

假设我们求出了 \(G\),计算 \(F\) 的时候对于只有一个质因子的可以用 \(g\) 算,否则我们枚举最小的质因子和它的次数,然后递归下去计算。

这部分直接递归的时间复杂度是 \(\mathcal O(n^{1-\varepsilon})\),常数较小。

然后考虑怎么计算 \(g(n)\)。现在我们暂时认为 \(f(p) = p^c\),令 \(g(x) = x^c\) ,则 \(g\) 为完全积性函数。

因此我们可以用一个类似埃氏筛的过程,\(G(n, k)\) 为筛完前 \(k\) 个素数后剩下位置(包含质数位和最小质因子 \(> k\) 的位置)\(g\) 的和。这部分时间复杂度也是 \(\mathcal O(\frac{n^\frac34}{\log n})\)。

类欧几里得算法

计算

\[f(a, b, c, n) = \sum_{i = 0}^n \left\lfloor\dfrac{ai+b}{c}\right\rfloor \]

先认为 \(0 \le a, b < c\),否则可以简单转化成这种形式,否则(记 \(m = \left\lfloor\dfrac{an+b}{c}\right\rfloor\)):

\[\begin{aligned} f(a, b, c, n) &= \sum_{i=0}^n\sum_{j=1}^m [j \le \dfrac{ai+b}c]\\ &= \sum_{i=0}^n\sum_{j=0}^{m-1} [i > \dfrac{jc + c - b - 1}a]\\ &= nm - \sum_{j=0}^{m-1} [i > \dfrac{jc + c - b - 1}a]\\ &= nm - f(c, c - b - 1, a, m - 1) \end{aligned} \]

最终的 \(c\) 可以取模(即上文「转化」):

\[f(a, b, c, n) = f(a \bmod c, b \bmod c, c, n) + \dfrac{n(n+1)}2\left\lfloor\dfrac ac\right\rfloor + (n+1)\left\lfloor\dfrac bc\right\rfloor \]

计算

\[\begin{aligned} g(a, b, c, n) &= \sum_{i=0}^n i\left\lfloor\dfrac{ai+b}{c}\right\rfloor\\ h(a, b, c, n) &= \sum_{i=0}^n \left\lfloor\dfrac{ai+b}{c}\right\rfloor^2 \end{aligned} \]

首先演绎 \(g\)。

先取模:

\[g(a, b, c, n) = g(a \bmod c, b \bmod c, c, n) + \dfrac{n(n+1)(2n+1)}6\left\lfloor\dfrac ac\right\rfloor + \dfrac{n(n+1)}2\left\lfloor\dfrac bc\right\rfloor \]

那么:

\[\begin{aligned} g(a, b, c, n) &= \sum_{j = 0}^{m-1}\sum_{i=0}^n i \cdot [j < \left\lfloor\dfrac{ai+b}{c}\right\rfloor] \end{aligned} \]

记 \(t = \left\lfloor\dfrac{jc + c - b - 1}{a}\right\rfloor\),则可以得到

\[\begin{aligned} g(a, b, c, n) &= \sum_{j = 0}^{m-1}\sum_{i=0}^n i \cdot [i > t]\\ &= \sum_{j=0}^{m-1}\dfrac 12 (t + n - 1)(n - t)\\ &= \dfrac 12 \left[mn(n + 1) - \sum_{j=0}^{m-1} t^2 - \sum_{j=0}^{m-1}t \right]\\ &= \dfrac12 [mn(n+1) - h(c, c - b - 1, a, m - 1) - f(c, c - b - 1, a, m - 1)] \end{aligned} \]

然后演绎 \(h\)。

先取模:

\[\begin{aligned} h(a, b, c, n) &= h(a \bmod c, b \bmod c, c, n)\\ &+ 2\left\lfloor\dfrac bc\right\rfloor f(a \bmod c, b \bmod c, c, n) + 2\left\lfloor\dfrac ac\right\rfloor g(a \bmod c, b \bmod c, c, n)\\ &+\dfrac{n(n+1)(2n+1)}6\left\lfloor\dfrac ac\right\rfloor^2 + (n+1)\left\lfloor\dfrac bc\right\rfloor^2 + n(n+1)\left\lfloor\dfrac ac\right\rfloor\left\lfloor\dfrac bc\right\rfloor \end{aligned} \]

以下沿用 \(m, t\)。

我们发现平方不好处理,于是考虑如下拆分:

\[n^2 = 2\dfrac{n(n+1)}2 - n = \left(2\sum_{i=0}^ni\right) - n \]

这样添加变量 \(j\) 时只会出现一个求和算子,而不会出现 \(\sum \times \sum\) 的情况。

于是

\[\begin{aligned} h(a, b, c, n) &= \sum_{i=0}^n \left\lfloor\dfrac{ai+b}{c}\right\rfloor^2\\ &= \sum_{i = 0}^n \left[\left(2\sum_{j=1}^{\left\lfloor\frac{ai+b}{c}\right\rfloor}j\right) - \left\lfloor\dfrac{ai+b}{c}\right\rfloor\right]\\ &= \left(2\sum_{i=0}^n \sum_{j=1}^{\left\lfloor\frac{ai+b}{c}\right\rfloor}j \right) - f(a, b, c, n)\\ \sum_{i=0}^n \sum_{j=1}^{\left\lfloor\frac{ai+b}{c}\right\rfloor}j &= \sum_{i = 0}^n \sum_{j = 1}^{\left\lfloor\frac{ai+b}{c}\right\rfloor - 1} (j + 1)\\ &= \sum_{j= 0}^{m - 1}(j + 1) \cdot \sum_{i = 0}^n \left[j < \left\lfloor\dfrac{ai+b}{c}\right\rfloor \right]\\ &= \sum_{j= 0}^{m - 1}(j + 1) \cdot \sum_{i = 0}^n [i > t]\\ &= \sum_{j= 0}^{m - 1}(j + 1)(n-t)\\ &= \dfrac 12 nm(m + 1) - \sum_{j= 0}^{m - 1}(j + 1)t\\ &= \dfrac 12 nm(m + 1) - g(c, c-b-1, a, m - 1) - f(c, c-b-1, a, m - 1) \end{aligned} \]

因此化简可得

\[\begin{aligned} f(a, b, c, n) &= nm - f(c, c - b - 1, a, m - 1)\\ g(a, b, c, n) &= \dfrac12 [mn(n+1) - h(c, c - b - 1, a, m - 1) - f(c, c - b - 1, a, m - 1)]\\ h(a, b, c, n) &= nm^2 - 2g(c, c-b-1, a, m - 1) - f(c, c-b-1, a, m - 1) \end{aligned} \]

在计算时可以考虑三个一起同步计算。时间复杂度 \(\mathcal O(\log n)\)。

例题

ISIJ2019T1

给定 \(n, m\),求有多少长度为 \(n\) 的序列 \(\{a\}\) 满足 \(1 \le a_i \le m\) 且 \(a_i < \min \{a_{i+2}, a_{i + 3} \}\)。对 \(1000003\) 取模。

原题 \(n, m \le 1000\),加强版 \(n, m \le 10^{18}\)。

考虑把满足条件的序列划分成极长不上升子段。显然每段长度 \(\le 2\),并且第 \(i\) 段的 $\max < $ 第 \(i + 1\) 段的 \(\min\)。

第一条显然,第二条的证明如下:

  • 如果以 \(i\) 开头的段长度为 \(2\),那么由 \(a_i < a_{i + 2}, a_{i + 3}\) 得证。
  • 如果以 \(i\) 开头的段长度为 \(1\),那么考虑以 \(i + 1\) 开头的段长度,如果为 \(1\),那么根据「极长不上升子段」得 \(a_i < a_{i + 1}\),否则由 \(a_i < a_{i + 2}\) 得证。

类似地可以反过来证明每一个满足划分后条件的序列都满足要求。

所以变成统计划分后的段。枚举有多少段长度为 \(2\),把这些段的两个数交换顺序就会变成一个不降序列,其中如果在一个段内则可以相等。直接组合数统计即可。

\(10^{18}\) 小模数的情况,可以使用 Lucas 定理,拆成每一位乘积,然后数位 DP。

AGC003D Anticube

有 \(n\) 个数,你需要选出尽量多的数,使得任意两个的乘积都不是完全立方数。

\(n \le 10^5, a_i \le 10^{10}\)。

首先想到分解质因数。但是显然不可暴力分解。于是先咕掉这个环节。

在分解后,我们注意到题目只关心质因数的幂次对 \(3\) 取模后的结果。于是我们对所有的 \(p^k\) 的 \(k \leftarrow k \bmod 3\),这样有一些数会变得相等,我们将它们放到同一类中,用这个相同的结果代表这一类。

这时,对于一个处理后的代表 \(x\),我们都能够找一个最小的 \(y\) 使得 \(xy\) 为完全立方数。这样的 \(y\) 显然是唯一的。因此我们存在若干对这样的矛盾关系。在每一对矛盾关系中,我们选择类大小较大的加入答案即可。

回到质因数分解。我们可以先预处理出 \(10^5\) 内的每一个素数及其平方。然后对于每一个数,我们暴力用 \([2, \sqrt[3]x]\) 内的素数试除,暴力计算指数\(\bmod 3\) 的值。操作后,结果仅可能有:

  1. 最后剩下的数为 \(1\)。
  2. 最后剩下的数为 \(\prod p_i\)。
  3. 最后剩下的数为 \(p_k^2\)。

\(2, 3\) 是好区分的。因此对于情况 \(2, 3\),我们已经有足够的信息继续算法。

时间复杂度 \(\mathcal O(n\sqrt[3]V)\)。

LOJ6714 Stupid Product

定义一个长度为 \(m\) 的正整数序列 \(\{a\}(\forall i \in [1, m], a_i > 1)\) 的权值为 \(\prod a_i\)。特别地,空序列的权值为 \(1\)。记权值为 \(x\) 的序列个数为 \(f(x)\)。

给定正整数 \(n\),求 \(\left(\sum\limits_{i=1}^n f(i)\right) \bmod 998244353\)。

\(n \le 10^{10}\)。

不难发现

\[f(x)= \begin{cases} 1 &\ x=1\\ \sum_{d | x, d \ne x} f(d) &\ x > 1 \end{cases} \]

因此要求

\[\begin{aligned} F(n) &= 1+\sum_{i=1}^n\sum_{j|i, j \ne i}f(j)\\ &= 1+\sum_{i=1}^n\left((\sum_{j|i}f(j)) - f(i)\right)\\ \Rightarrow 2F(n)-1 &=\sum_{i=1}^n\sum_{j|i}f(j)\\ &= \sum_{d=1}^n\sum_{i=1}^{\left\lfloor\tfrac nd\right\rfloor}f(i)\\ &= \sum_{d = 1}^nF(\left\lfloor\dfrac nd\right\rfloor)\\ \\ \Rightarrow F(n) &= 1+\sum_{d = 2}^nF(\left\lfloor\dfrac nd\right\rfloor) \end{aligned} \]

杜教筛即可。

CF364D Ghd

定义 \(n\) 个数的「最大半公约数」为最大的 \(d\) 满足其为至少 \(\left\lceil\dfrac n2\right\rceil\) 个数的约数。

给定 \(n\) 个数,求他们的「最大半公约数」。

\(n \le 10^6, a_i \le 10^{12}\)。

随机化。每次从输入的 \(n\) 个数中随机选取一个记为 \(x\),然后对 \(x\) 质因数分解,记录其所有正因子。记 \(cnt_i\) 表示 \(\{a\}\) 中有多少个数可以被 \(x\) 的第 \(i\) 个因数 \(d_i\) 整除,则我们从大到小枚举 \(d_i\),如果 \(cnt_i \ge \left\lceil\dfrac n2\right\rceil\),则 \(d_i\) 就是我们想要的答案。

接下来思考如何求取 \(cnt_i\)。我们将 \(n\) 个数枚举一遍,每次找到 \(\gcd(x, a_i)\) 在 \(d\) 数组中的位置 \(\text{pos}\),然后使 \(cnt_{\text{pos}} \leftarrow cnt_{\text{pos}} + 1\)。

同时,如果 \(d_i \mid d_j\),那么 \(cnt_i \leftarrow cnt_i + cnt_j\)。这是因为我们仅对 \(\gcd\) 进行了记录,而没有记录其倍数。

对于整个操作,最终答案有 \(\dfrac 12\) 的概率是正确的。因此随机十次,大概可以通过本题。

CF571E Geometric Progressions

有 \(n\) 个等比数列 \(\{a_i, a_ib_i, a_ib_i^2, \ldots\}\),求最小的在所有的等比数列中都出现的数 \(\bmod (10^9 + 7)\) 后的值,或宣告不存在。

\(n \le 100, a_i, b_i \le 10^9\)。

首先将 \(a_i, b_i\) 全部分解质因数,设 \(a_i = \prod_j p_j^{c_{i, j}}, b_i = \prod_j p_j^{d_{i, j}}\)。

对于某个 \(j\),如果存在 \(d_{i, j} = 0\),如果全 \(0\) 我们可以判断 \(c\) 是否相等,如果相等忽略,否则无解

如果有 \(0\) 有非 \(0\),易知最多一个可行解,找出来判断即可。

现在所有的 \(d_{i, j}\) 都不为 \(0\)。

我们对于两个不同的质因子 \(1, j\),如果存在 \(i\) 使得 \(\dfrac{d_{1, j}}{d_{i, j}} \ne \dfrac{d_{1, 1}}{d_{i, 1}}\),也最多一个可行解。

如果有 \(i\) 满足 \(d\) 成比例,可以判断一下 \(c\) 是否成比例,否则无解。

剩下就是一个 \(\text{exCRT}\) 了。

SPOJ20174 DIVCNT3 - Counting Divisors (cube)

定义 \(d(n)\) 为 \(n\) 的约数个数,求

\[S_3(n) = \sum_{i = 1}^n d(i^3) \]

多组数据,\(T \le 10^4, n \le 10^{11}\)。时限 \(\text{20s}\),空间限制 \(\text{1.46GB}\)。

考虑 Powerful Number。注意到 \(f(p) = d(p ^3) = 4\),我们可以令 \(g(p) = d * d\)。

问题变为如何计算 \(G(n)\)。

\[\begin{aligned} G(n) &= \sum_{i \le n} (d * d)(i)\\ &= \sum_{ij \le n} d(i)d(j)\\ &= \sum_{i}d(i)\cdot\left(\sum_{i, j \le n} d(j)\right) \end{aligned} \]

CF1552H Guess the Perimeter

平面中有个矩形满足四个顶点的横、纵坐标均在 \([1, 200]\) 之间,每次可以给任意个整点点求有多少个在矩形内,你需要在 \(4\) 次询问中求出它的周长。

先用一次询问查出面积。

考虑隔一行查一行,这样如果高是奇数就可以得到答案。

否则考虑每 \(4\) 行查一行,如果高\(\bmod 4 = 2\) 可以得到答案。

以此类推,注意到 \(2^8 > 200\),就只有 \(7\) 种这样的查法,二分即可。

UOJ216 Jakarta Skyscrapers

有一个长度为 \(10^{18}\) 的 \(01\) 串 \(s\),初始时全为 \(0\)。一开始给定 \(a, b\) ,令 \(s_a = s_b = 1\)。

定义一次操作为:对于某个 \(i, j\) 满足 \(s_i = s_j = 1\),将 \(s_{i - j}\) 改为 \(1\)。

求能否在 \(400\) 次操作内将 \(s_c\) 改为 \(1\)。

\(1 \le a, b, c \le 10^{18}\)。

不考虑次数限制,能生成的数一定是 \(\gcd\) 的倍数,且不超过 \(\max(a,b)\)。

加入次数限制,考虑把 \((a,b)\leftarrow (a \bmod b,b)\) 倍增优化,即:

\[a\rightarrow a-b\rightarrow a-2b\rightarrow 2b\rightarrow a-4b\rightarrow 4b\rightarrow a-8b \]

这样操作次数显然是 \(\mathcal O(\log n)\) 的。

CF1091G New Year and the Factorisation Collaboration

给一个大数 \(n\),对其质因数分解。

提供高精度交互库,可以计算 \(x + y, x - y, x \times y, \dfrac xy, x^y, \sqrt x\) 在\(\bmod n\) 意义下的值。

一共可以使用不超过 \(100\) 次,同时除法和乘方时间需要不超过 \(\text{350ms}\),开平方不超过 \(\text{80ms}\)。时限 \(\text{6s}\)。

保证 \(n\) 所有质因子不同,且个数在 \([2, 10]\) 之间,全部形如 \(4x + 3\) 的形式。

\(n \le 2^{1024}\)。

注意到它提供的库中只有 \(\sqrt{x}\) 我们难以计算。

考虑我们现在随机 \(x\),询问 \(x' = \sqrt{y = x^2}\),如果 \(x \ne x'\) 则 \((x - x')(x + x') \equiv 0\ (\bmod n\ )\)。

假设 \(n = \prod p_i\),我们知道有 \(x' \equiv \pm x\ (\bmod p_i\ )\)。由于 \(x\) 随机,正负概率均为 \(\dfrac 12\) 。

也就是说,\(x - x'\) 和 \(x + x'\) 随机划分了 \(p_i\)。

多随机几次可以较稳定地求解。

校门外的树

给定一个序列,\(Q\) 次询问,每次给定一个区间 \(l, r\),求

\[\left[\prod_{l \le i < j \le r} \gcd(a_i, a_j)\right] \bmod 998244353 \]

\(n, Q, \max\{a_i\} \le 10^5\)。

先考虑如何计算答案:把每个数字 \(k\) 拆成 \(\prod p_i^{k_i}\) 的形式,其中 \(p_i\) 是第 \(i\) 个质数。

注意到

\[\gcd(a, b) = \prod p_i^{\min(a_i, b_i)} = \prod_i \prod_{j=1}^{\min(a_i, b_i)}p_i \]

所以对于所有 \(p_i^j (j > 0)\) 如果同时是 \(a, b\) 的因数就会给答案产生 \(p_i\) 贡献。那么答案就是

\[\prod_{i, j} p_i^{\binom{c[p_i^j]}2} \]

其中 \(c[x](c_x)\) 表示 \(x\) 的个数。

CF1030G Linear Congruential Generator

有 \(n\) 个线性同余生成器,每个形如 \(f_0, a, b, p\),使得 \(f_i = (af_{i - 1} + b) \bmod p\)。

现在 \(p\) 给定,求对于所有的 \(f_0, a, b\),能生成出的不同的 \([f_{1, i}, f_{2, i}, \ldots, f_{n, i}]\) 这样的 tuple 个数的最大值。

\(n \le 2 \times 10^5, p \le 2 \times 10^6, p \in \mathbb{P}\)。

注意到每个生成器都形如一个 \(\rho\),也就是一个长度为 \(c\) 的环加上一个长度为 \(l\) 的柄,则答案为 \(\max l + \operatorname{lcm} c\)。

当 \(a = 0\) 则 \(l = 1, c = 1\),当 \(a = 1\) 则 \(l = 0, c \mid p\) 。

否则由于 \(p\) 是质数,\((ax + b) \bmod p\) 可逆,因此 \(l = 0\),然后有 \((a^c)x + b\sum\limits_{i = 0}^{l - 1}a_i \equiv x\ (\bmod p\ )\) ,即 \((a^c - 1)(x - \dfrac{b}{a-1}) \equiv 0\),从而有 \(c \mid (p - 1)\)。

由于 \(l \le 1\),所以我们用 \(\operatorname{lcm}\) 换 \(l\) 一定不优。从大到小对 \(p\) 贪心即可。

UOJ221 [NOI2016] 循环之美

求能用 \(\dfrac xy(1 \le x \le n, 1 \le y \le m)\) 表示的 \(k\) 进制纯循环小数个数。

\(n, m \le 10^9, k \le 2000\)。

see NOI2016 循环之美 - lk's blog

题意相当于 \(\sum\limits_{1\leq x\leq n,1\leq y\leq m}[\gcd(x,y)=1][\gcd(y,k)=1]1\)。考虑反演。

\[\begin{align} &\mathrm{lcm}(x,y)=\frac{xy}{\gcd(x,y)}=x\cdot\frac{y}{\gcd(x,y)}\\ &\sum_{1\leq x\leq n,1\leq y\leq m}[\gcd(x,y)=1][\gcd(y,k)=1]1\\ =&\sum_{1\leq x\leq n,y|k}\mu(x)\mu(y)\lfloor\frac{n}{x}\rfloor\lfloor\frac{m}{\mathrm{lcm}(x,y)}\rfloor\\ =&\sum_{1\leq x\leq n,y|k}\mu(x)\mu(y)\lfloor\frac{n}{x}\rfloor\lfloor\frac{\lfloor\frac{m}{x}\rfloor}{\frac{y}{\gcd(x,y)}}\rfloor\\ \end{align} \]

可以发现 \(x\) 确定的时候,\(\mu(x),\lfloor\frac{n}{x}\rfloor,\lfloor\frac{m}{x}\rfloor\) 都是确定的,由于 \(y \mid k\),\(\dfrac{y}{\gcd(x,y)}\) 和 \(\gcd(x, k), y\) 相关而不和 \(x\) 相关。

对 \(\lfloor\frac{n}{x}\rfloor,\lfloor\frac{m}{x}\rfloor\) 整除分块,则我们需要计算 \(\sum\limits_{l\leq x\leq r}[\gcd(x,k)=y]\mu(x)\)。

\[g(n,k,y)=\sum_{1\leq x\leq n}[\gcd(x,k)=y]\mu(x)\\ f(n,k)=g(n,k,1)\\ g(n,k,y)=\mu(y)f(\lfloor\frac{n}{y}\rfloor,k)\\ f(n,k)=\sum_{x=1}^n\mu(x)-\sum_{i|k,i\not=1}g(n,k,i) \]

第二条正确性显然。

对于第一条,\(g(n,k,y)=\mu(y)f(\lfloor{\frac{n}{y}}\rfloor,\frac{k}{y})\)。有可能的区别是 \(k\) 某一种质因子,全部出现在 \(y\) 中。如果有 \(\ge 2\) 个,那么已经 \(\mu(y) = 0\) 了。如果只有 \(1\) 个,那么再来一个质因子就直接 \(=0\) 了,如果是 \(\dfrac ky\) 就不会 \(=0\) 所以合理。

\(\mu\) 前缀和可以用杜教筛,\(f\) 可以直接暴力,复杂度 \(\mathcal O(\sqrt n \cdot d(k))\),预处理 \(\le n^{\tfrac 23}\) 的 \(f\) 就是 \(\mathcal O(\sqrt[3]n \cdot d(k) + n^{\tfrac 23})\)。

然后 \(y\) 的部分,可以预处理每个 \(x \mid k, \mu(x) \ne 0, y \mid k\) 时的 \(\dfrac{y}{\gcd(x, y)}\) 。

标签:lfloor,le,数论,dfrac,sum,笔记,20230801,rfloor,left
From: https://www.cnblogs.com/alphayeung/p/17598966.html

相关文章

  • 笔记:KMP的复习
    Record一个重要的字符串算法,这是第三次复习。通过总结我认为之所以某个算法总是忘记,是因为大脑始终没有认可这种算法的逻辑(也就是脑回路)。本篇主要讲解从KMP的应用场景,再到算法知识,以及例题。Main现有两个字符串\(A,B\),求出\(A\)在\(B\)中出现的次数。范围:字符串长度......
  • RASP知识学习笔记
    RASPRASP(Runtimeapplicationself-protection)是一种内置或链接到应用程序环境中的安全技术,与应用程序融为一体,实时监测、阻断攻击,使程序自身拥有自我保护的能力。工作原理RASP技术是一种基于服务器的技术,一旦应用程序运行开始时就会激活。而且,所有RASP产品都包含一个运行时监......
  • 关于菜鸡学习RHEL8的一些小笔记--->LVM逻辑卷
    LVM基础概念:LVM()逻辑卷管理器,主要适用于对Linux环境下面磁盘分区的管理机制在真实的场景中,服务器使用的越久,所产生的数据量就会越来越大,导致硬盘本身空间越来越小;这里针对分区来看,如果想要扩大容量,就得重新挂载硬盘,然后去做数据迁移,这样就会直接导致业务停止运行;#这里分区的大小是在......
  • 【学习笔记】记忆化搜索
    记忆化搜索目录前置知识:概念:实现:oiwiki:记忆化搜索建议搭配食用。前置知识:深度优先搜索DFS概念:搜索通常通过递归来实现,但是递归过程中往往有很多结果被重复计算,因此降低了搜索的效率。因此记忆化搜索就是再递归的过程中记录已经遍历过的状态与结果,用到的时候再直接取出......
  • 最小割树 学习笔记
    问题描述给定一张图,求任意两点的最小割。要求跑\(n\)次最大流。做法暴力需要跑\(n^2\)次最大流,然而这样很浪费,因为求出\(u,v\)两点的最小割以后,我们还获得了至少一种最小割方案,可以通过这一方案获得更多信息。注意到假设通过最小割断开后,\(s,t\)所在集合分别为\(S,T......
  • 如何提交学习笔记到Github
    前提条件:已经注册好Github账号步骤:*登录Github账号后,点击“+”新建仓库,根据提示命名和初始化仓库*克隆仓库到本地`gitclone<仓库的URL>`*在仓库文件夹里修改和添加文件*提交变更 *`gitadd*` *`gitcommit-m"对变更的描述"`*推送到Github`gitpushoriginmain`......
  • 白日梦的Elasticsearch实战笔记,32个查询案例、15个聚合案例、7个查询优化技巧。
    目录一、导读二、福利:账号借用三、_searchapi搜索api3.1、什么是querystringsearch?3.2、什么是querydsl?3.3、干货!32个查询案例!四、聚合分析4.1、什么是聚合分析?4.2、干货!15个聚合分析案例五、7个查询优化技巧公众号、欢迎关注一、导读Hi!大家久等了!时隔10天,白日梦的Elasticsea......
  • 白日梦的Elasticsearch实战笔记,ES账号免费借用、32个查询案例、15个聚合案例、7个查询
    目录一、导读二、福利:账号借用三、_searchapi搜索api3.1、什么是querystringsearch?3.2、什么是querydsl?3.3、干货!32个查询案例!四、聚合分析4.1、什么是聚合分析?4.2、干货!15个聚合分析案例五、7个查询优化技巧欢迎关注一、导读Hi!大家久等了!时隔10天,白日梦的Elasticsearch笔记......
  • C++ Primer 学习笔记——第九章
    第9章顺序容器前言本章是对第三章——字符串、向量和数组的扩展延伸,在第三章我们对标准库的顺序容器有一定了解,那么学习完本章我们对顺序容器的知识将会更加完整。标准库定义了几种关联容器,关联容器中元素的位置由元素相关联的关键字值决定。我们将在本章对关联容器做一定了解......
  • git学习笔记(十二):标签管理
    打标签,方便找。tag就是一个让人容易记住的有意义的名字,跟某个commit捆绑在一起。(就是一个指向commit的指针,原来的哈希表值太复杂了,不方便沟通,所以给了一种定制的简化版。)打标签切换到需要打标签的分支上,然后使用命令$gittagv1.0可以使用gittag查看所有标签。默认的标......