数论日志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;
}
posted @ 2020-10-14 22:19  yu__xuan  阅读(104)  评论(3编辑  收藏  举报