数学 / 数论
gcd
重要结论:\(\gcd(a,b) = \gcd(b, a\bmod b)\)。
唯一分解定理
对于任意大于 \(1\) 的正整数 \(n\),有 \(n = \prod p_i^{a_i}\)。那么约数个数就是 \(\prod (a_i + 1)\)。
素数分布
记 \(\pi(x)\) 表示不超过 \(x\) 的素数个数。有 \(\pi(x) \approx \frac{x}{\log x}\),且 \(x\) 越大越精确。
积性函数
对于函数 \(f(x)\),如果对于任意一对互质的 \(n,m\),有 \(f(nm) = f(n)f(m)\),称其为积性函数。例如 \(f(x) = \phi(x)\)。
对于函数 \(f(x)\),如果对于任意 \(n,m\) 有 \(f(nm) = f(n)f(m)\),称其为完全积性函数。例如 \(f(x) = x^n\)。
对于积性函数 \(f(x)\),显然有 \(f(x)=\prod f(p_i^{a_i})\)。
欧拉函数
\(\phi(n)\) 表示 \(1\sim n-1\) 中与 \(n\) 互质的数的个数。有
其中 \(p\) 为质数。那么如果关心单点的欧拉函数,可以做到根号。
前面提到欧拉函数是积性函数,可以使用线性筛线性预处理。
具体假设我们在筛 \(i \times p_j\),那么 \(p_j\) 就是它的最小质因子。如果 \(p_j\nmid i\),表示 \(i\) 中 \(p_j\) 没有出现过,即 \(i\) 与 \(p_j\) 互质,\(\phi(i\times p_j) = \phi(i)\phi(p_j) = \phi(i)(p_j - 1)\)。否则说明 \(i\) 中出现了 \(p_j\),\(p_j\) 的对应贡献计算完毕,有 \(\phi(i\times p_j) = \phi(i) \times p_j\)。
线性筛
朴素求质数就不聊了。考虑我们现在想预处理出某个积性函数,考虑用线性筛来做。
例子:求约数个数。和求欧拉函数类似地,当 \(i\) 与 \(p_j\) 互质时 \(f(i\times p_j) = f(i)f(p_j)\)。否则 \(i\) 中出现过 \(p_j\),那咋办。我们维护每个数的最小质因子 \(mn_i\) 和其出现次数 \(k_i\),在计算 \(f(i\times p_j)\) 的时候,我们的目的是找到两个互质的数来算贡献,除掉 \(mn_i\) 是一种方法,即 \(f(i\times p_j) = f(\frac{i}{mn_i^{k_i}}) \times f(p_j^{k_i+1})\),注意到 \(mn_i = p_j\)!
实际上也可以考虑求约数个数那个柿子,\(i\times p_j\) 无非是 \(i\) 多了个 \(p_j\) 贡献,除掉原来的乘上新的,即当 \(\gcd(i,p_j) \ne 1\) 的时候有 \(f(i\times p_j) =\frac{f(i)}{k_i + 1} \times (k_i+2)\)。
乘法逆元
在模 \(p\) 意义下,\(x\) 的逆元 \(x^{-1}\) 满足 \(xx^{-1} \equiv 1\pmod{p}\)。
下面是几种求逆元方法。下文中假设当前在求 \(a\) 的逆元,即求 \(a^{-1}\) 使得 \(aa^{-1}\equiv 1\pmod{p}\)。
费马小定理
当 \(p\) 为素数,\(\gcd(a,p)=1\) 的时候有 \(a^{p-1} \equiv 1\pmod{p}\)。
那不就是 \(aa^{p-2} \equiv 1\pmod{p}\),那么 \(a^{p-2}\) 即为所求。
欧拉定理
当 \(\gcd(a,p)=1\) 时,有 \(a^{\phi(p)} \equiv 1\pmod{p}\)。类似地,\(a^{\phi(p)-1}\) 即为所求。
可以发现,费马小定理不就是欧拉定理的特殊情况。
扩欧求逆元
记 \(x = a^{-1}\),现在在求解同余方程 \(ax \equiv 1\pmod{p}\),那么 \(ax = kp + 1\),\(ax - kp = 1\),有解当且仅当 \(\gcd(a,p)=1\)。扩欧求解同余方程即可。
线性推逆元
适用于求解一串数逆元的情况。
考虑当前在求解 \(i^{-1}\),把 \(p\) 写成 \(\lfloor \frac{p}{i} \rfloor i + r\),其中 \(r\) 是余数。那么 \(\lfloor \frac{p}{i}\rfloor i + r \equiv 0\pmod{p}\)。两边同乘 \((ir)^{-1}\),得到 \(\lfloor \frac{p}{i}\rfloor r^{-1} + i^{-1} \equiv 0\pmod{p}\),那么 \(i^{-1} \equiv -\lfloor\frac{p}{i} \rfloor r^{-1} \pmod{p}\)。可以加 \(p\) 避免负数。
inv[1] = 1;
for (ll i = 2; i < p; ++ i )
inv[i] = (p - p / i) * inv[p % i] % p;
线性推逆元(二)
神人做法。但是不需要脑子。使用阶乘来转化。
考虑维护 \(f_i\) 表示 \(i\) 的阶乘,\(g_i\) 表示 \(i\) 的阶乘的逆元。考虑去递推 \(g\),显然 \(g_i = g_{i+1} (i+1)\)。
那么在计算 \(i\) 的逆元的时候,有 \(i^{-1} = g_i \times f_{i-1} \bmod p\)。
线性推逆元(三)
考虑一个更神人的做法。
假设我们现在对于每个 \(i\),要预处理出 \(i^N\),\(N\) 是给定的。记 \(f(i)\) 表示这个东西。
前面提到这个是完全积性函数,轻松使用线性筛来维护。转移的时候直接无脑 \(f(i\times p_j) = f(i)f(p_j)\) 即可。
注意到令 \(N = p -2\),你就得到了每个数的逆元!
整除分块
朴素
假设当前在计算 \(\displaystyle \sum_i \lfloor \frac{n}{i}\rfloor\),你发现 \(i\) 在一段连续的取值时,\(\lfloor \frac{n}{i} \rfloor\) 的取值相同。考虑对这一段的取值一起计算贡献。
考虑当前的商 \(d = \lfloor \frac{n}{i} \rfloor\),那么对应的 \(i\) 需要满足:
由于 \(d\) 至多有 \(O(\sqrt V)\) 种取值。那么至多有 \(\sqrt V\) 个块。对于每个块单独处理,这样我们就在 \(O(\sqrt V)\) 的时间复杂度解决了问题。
考虑怎么实现,对于每一块,左端点 \(l\) 等于前一块的右端点 \(r'\) 加 \(1\),右端点 \(r = \lfloor \frac{n}{\lfloor n/l \rfloor}\rfloor\)。那么可以很方便的枚举。
当然,如果要计算 \(\displaystyle \sum_i f(i)g(\lfloor \frac{n}{i} \rfloor)\),假设能在 \(O(x)\) 计算 \(\sum_{l}^r f(i)\),也可以做到 \(O(x\sqrt V)\)。
ll ans = 0;
for (ll l = 1, r = 1; l <= n; l = r + 1 ) {
r = n / (n / l);
ans += (r - l + 1) * (n / l);
}
cout << ans << '\n';
多维
左端点 \(l\) 同理,右端点 \(r\) 需要取所有合法右端点的最小值,即
9.20 杂项
CF1295D
根据 gcd 的结论,\(\gcd(a,b) = \gcd(b, a\bmod b)\)。
那么本题里,\(\gcd(a+x,m) = \gcd(x,m) = \gcd(a,m)\),不妨令 \(p = \gcd(a,m)\),那么 \(\gcd(x,m) = p\),即 \(\gcd(\frac{x}{p},\frac{m}{p}) = 1\),即 \(\phi(\frac{m}{p})\)。可以根号。
ABC259E
你考虑修改一个数啥时候会改变 lcm,显然它分解之后如果一个质因子的指数是所有数里最大的,就会改变 lcm。因为 lcm 我们只关心所有指数的最大值。于是枚举每个数,如果满足贡献加 \(1\)。注意如果每个数变成 \(1\) 都会改变 lcm,原来的 lcm 就不能算在贡献里。
CF1114F
注意到值域小,质数最多只有 \(62\) 个。那你考虑欧拉函数只关心数本身的值,和它分解完之后某个质因子是否存在过,不关心次数。那你考虑 sgt 维护区间乘法,再状态压缩维护某个质因子是否出现过,longlong 开的了。那么区间合并的时候直接或起来。那么做完了,代码是一坨。
P2155
考虑求出 \(\phi(m!)\),这个是容易得。然后有个结论 \(\gcd(a+kb,b) = \gcd(a, b)\),于是你把 \(n!\) 看作若干个长度为 \(m!\) 的区间。答案即为 \(\frac{n!}{m!}\phi(m!)\)。也就是 \(n! \prod_{p\mid m!} \frac{p}{p-1}\),注意这个 \(R\) 比较恶心。
ABC222G
\(a_n = 2 \frac{10^n-1}{9}\)。由于 \(K \mid a_n\) 令 \(2\frac{10^n-1}{9} = mK\),\(2(10^n-1) = 9mK\)。
由于 \(9K \mid 2(10^n-1)\),妙妙转化是 \(210^n\equiv 2\pmod{9K}\)。分讨:
- \(2 \nmid K\),\(\gcd(2,9K) = 1\),\(2\) 有逆元。两边同乘 \(2^{-1}\) 得到 \(10^n \equiv 1 \pmod{9K}\)。
- \(2\mid K\),等价于 \(10^n \equiv 1\pmod{\frac{9K}{2}}\)。
现在要求解 \(10^n \equiv 1\pmod{Q}\) 的 \(n_{\min}\)。欧拉定理可知 \(\gcd(10,Q)\ne 1\) 时无解。否则 \(n = \phi(Q)\) 为一解,但是如何求最小解?可以证明答案肯定是 \(\phi(Q)\) 的某个约数,枚举约数判断即可。
证明:
反证法。记答案为 \(d\),若 \(d \nmid \phi(Q)\),有 \(\phi(Q) = kd + r\)。\(10^{\phi(Q)} = 10^{kd} 10^{r} \equiv 1\pmod{Q}\),由于 \(10^{kd} = 10^{d^k} \equiv 1\pmod{Q}\),所以后者 \(10^r \equiv 1\pmod{Q}\),但是 \(r < d\),与 \(d\) 为答案矛盾。
P2303
枚举 gcd 为 \(d\),只需计算 \(\gcd(i,n) = d\) 的 \(i\) 个数。即 \(\gcd(\frac{i}{d}, \frac{n}{d}) = 1\) 的个数,即 \(\phi(\frac{n}{d})\)。
P2568
枚举素数 \(p\) 作为 gcd。只需计算 \(\gcd(x,y) = p\) 的 \(x,y\) 对数。钦定 \(x < y\),对于每一个 \(y \in [1,n]\),满足条件的 \(x\) 即为 \(\phi(\frac{y}{p})\),对欧拉函数做前缀和即可。注意这个钦定,要二倍再减一。
AGC003D
考虑什么时候两个数乘起来会是立方数。对于分解后的每个质数的指数,需要两者相加 \(\bmod 3=0\)。先把每个数里每个指数对 \(3\) 取模。那每个数都能表示成 \(ab^2\) 的形式,要求 \(b\) 最大以使得唯一。那么对于 \((a,b)\) 只有 \((b,a)\) 不合法,取两者出现次数最大值即可。
P5874
一个结论是我们只会在一天卖马。答案即为 \(\max_i \prod_{j=1}^{i} X_jY_i\)。容易使用 sgt 维护。但是乘积太大了,那咋办。考虑取对数,乘法变成加法,维护两个乘积,两个答案即可。
浙公网安备 33010602011771号