数论日志20201014
整除
概念
\(a\) 能被 \(b\) 整除,记作 \(b|a\),读作 \(b\) 整除 \(a\)。
称 \(b\) 是 \(a\) 的约数,\(a\) 是 \(b\) 的倍数。
性质
- \(0\) 被每一个整数整除。
- 若 \(a|b\),那么 \(a|kb\)。
- 若 \(a|b\) 并且 \(b|a\),那么 \(a=b\)。
- 若 \(a|b\) 并且 \(b|c\),那么 \(a|c\)。
- 若 \(a|b\) 并且 \(c|d\),那么 \(ac|bd\)。
- 若 \(a|b\) 并且 \(a|c\),那么 \(a|(nb+mc)\)。
- 若 \(n\in\mathbb{N^{*}}\),那么 \((a-b)|(a^n-b^n)\)。
- 若 \(n\) 是奇数,那么 \((a+b)|(a^n+b^n)\)。
- 若 \(n\) 是偶数,那么 \((a+b)|(a^n-b^n)\)。
- 任意 \(n\) 个连续正整数的乘积必能被 \(n!\) 整除。
- 若 \(2\) 能整除 \(n\) 的末位,那么 \(2|n\);如果 \(4\) 能整除 \(n\) 的最后两位,那么 \(4|n\);如果 \(8\) 能整除 \(n\) 的最后三位,那么\(8|n\)。
- 若 \(3\) 能整除 \(n\) 的各位数字之和,那么 \(3|n\);\(9\) 也是。
- 若 \(5\) 能整除 \(n\) 的末位,那么 \(5|n\);如果 \(25\) 能整除 \(n\) 的最后两位,那么 \(25|n\);如果 \(125\) 能整除 \(n\) 的最后三位,那么\(125|n\)。
- 若 \(11\) 能整除 \(n\) 的偶数位之和与奇数位之和的差,那么 \(11|n\)。
快速幂
\(a^n\times a^m = a^{n+m}\)
\(11=2^0+2^1+2^3\)
\(a^11=a^{2^0+2^1+2^3}=a^{2^0}\times a^{2^1}\times a^{2^3}\)
只需要计算 \(a^{2^k}\) 就行。
能快速的计算 \(a^b\),时间复杂度 \(O(logb)\)。
ll qow(ll a, ll b) {
ll ans = 1, base = a;
while (b) {
if (b &1) ans = ans * base % mod;
base = base * base % mod;
b >>= 1;
}
return ans % mod;
}
龟速乘
计算 \(a\times b\bmod c\),其中 \(a,b,c\) 都是 \(1e18\) 级别的,防止爆 long long
。
\(a\times n + a\times m = a \times {n+m}\)
\(11=2^0+2^1+2^3\)
\(a \times 11=a \times (2^0+2^1+2^3)=a\times 2^0+ a\times 2^1 + a \times 2^3\)
只需要计算 \(a\times{2^k}\) 就行。
ll qmul(ll x, ll y) {
ll ans = 0;
while (y) {
if (y & 1) ans = ans + x, ans %= m;
x = (x + x) % m;
y >>= 1;
}
return ans % m;
}
素数
概念
如果一个大于 \(1\) 的数 \(n\) 的约数只有 \(1\) 和 \(n\) 那么 \(n\) 是素数,又叫质数。
除了 \(1\) 的其他数叫做合数。
\(1\) 既不是素数也不是合数。
埃氏筛
从小到大将每一个质数的倍数标记为合数。
is_prime(int N) {
for (int i = 2; i <= N; ++i) {
if (!prime[i]) {
for (int j = i + i; j <= N; j += i) prime[j] = true;
}
}
}
欧拉筛
埃氏筛中有的数会被筛多次,优化成每个数只会被筛一次。
void getprime() {
for (int i = 2; i <= n; ++i) {
if (!vis[i]) prime[++cnt] = i;
for (int j = 1; j <= cnt; ++j) {
if (i * prime[j] > n) break;
vis[i * prime[j]] = 1;
if (i % prime[j] == 0) break;
}
}
}
唯一分解定理
大于 \(1\) 的自然数可以写成多个素数相乘的形式,也叫算数基本定理
积性函数
概念
对于一个积性函数 \(f(x)\),当 \(\gcd(a,b) = 1\) 时,\(f(ab) = f(a) \times f(b)\)。
对于一个完全积性函数 \(g(x)\),\(g(ab) = g(a) \times g(b)\)。
常见的积性函数
\(\rm Id\):单位函数,\(\rm Id(x)=x\)。
\(\rm Id_k\):幂函数,\(\rm Id_k(x)=x\)。
\(\varphi\):欧拉函数,\(\varphi(x)\) 为小于等于 \(x\) 的数中与 \(x\) 互质的数个数。
\(\mu\):莫比乌斯函数。
\(1\):\(1(x)=1(\forall x\geq1)\)。
\(d\):\(d(x)\) 表示 \(x\) 的约数个数。
逆元
概念
如果 \(xy\equiv 1 (\bmod n)\),那么 \(y\) 是 \(x\) 在模 \(n\) 意义下的逆元,记为 \(x^{-1}\)。
exgcd求逆元
void exgcd(int a, int b, int& x, int& y) {
if (b == 0) {
x = 1, y = 0;
return;
}
exgcd(b, a % b, y, x);
y -= a / b * x;
}
线性求逆元
inv[1] = 1;
for (int i = 2; i < n; ++i) {
inv[i] = (n - inv[n % i] * (n/i) % n) % n;
}