从1开始的数论

从1开始的数论

11Dimensions

基础知识&&使用的概念

整除

对于正整数\(n,m\),如果存在整数\(q\)使得\(n=qm\),则称\(m\)整除\(n\),记作\(m|n\)

\(m\)\(n\)的约数,\(n\)\(m\)的倍数

最大公约数

对于正整数\(a,b\),若正整数\(d\)满足\(d|a\)\(d|b\),则称\(d\)\(a\)\(b\)的公约数。

\(a\)\(b\)最大的公约数称为\(a,b\)的最大公约数,记作\(gcd(a,b)\)或者\((a,b)\)

\(d\)\(a,b\)的公约数等价于\(d|gcd(a,b)\)

互质

若正整数\(a,b\)满足\(gcd(a,b)=1\),则称\(a\)\(b\)互质。

有时也记为\(a⊥b\)。(讲师在\(NOI2016\)讲题遇到的)

取整函数

高斯函数

对于实数\(x\),记\(\lfloor x\rfloor\)为不超过\(x\)的最大整数。

\(\lfloor x\rfloor\)也是满足如下关系的唯一整数:

\[\large\lfloor x\rfloor<=x<=\lfloor x\rfloor+1\]

基础应用:

对于正整数\(n\),\(1\)\(n\)\(d\)的倍数有\(\lfloor \frac{n}{d}\rfloor\)个。

我们时常要考虑形如\(\lfloor \frac{n}{d}\rfloor\)的数。

为行文方便,后文可能会称这些数为特殊点。

性质:

对于任意的\(x\)与正整数\(a,b\),我们均有:

\[\large {\lfloor\lfloor\frac{x}{a}\rfloor / b \rfloor=\lfloor \frac{x}{ab}\rfloor}\]

对于正整数\(n\),考虑当\(1≤d≤n\)时,\(\lfloor \frac{n}{d}\rfloor\)的不同取值个数。

\(d\leq \sqrt{n}\),则能得到的\(\lfloor \frac{n}{d}\rfloor\)只有不超过\(\sqrt{n}\)种。

\(d>\sqrt{n}\),则\(\lfloor \frac{n}{d}\rfloor\leq\frac{n}{d}<\sqrt{n}\),又因为\(\lfloor\frac{n}{d}\rfloor\)是正整数,故此时可能的取值也不超过\(\sqrt{n}\)种。

综上,\(\lfloor \frac{n}{d}\rfloor\)可能的取值不超过\(2\sqrt{n}\)种。

例题:

\(\large\sum_{d=1}^{n}\lfloor\frac{n}{d}\rfloor\)\(n\leq10^{14}\)

直接做肯定不行,因为\(n\leq10^{14}\)

我们转变方法,枚举\(\lfloor\frac{n}{d}\rfloor\)的取值。对于\(\lfloor\frac{n}{d}\rfloor\)的每个取值,对应的\(d\)的范围是一个区间,所以我们找到每个区间的端点,枚举\(\lfloor\frac{n}{d}\rfloor\)的取值即可

如何求每个区间的端点呢?

假设\(\lfloor \frac{n}{d}\rfloor=x\)\(x\epsilon N^{*}\)

取值为\(\lfloor \frac{n}{d}\rfloor=x\)的区间右端点就是\(\lfloor\frac{n}{x}\rfloor\)

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
using namespace std;

int main() {
    ll n = 0, ans = 0;
    scanf("%lld", &n);
    for(ll i = 1; i <= n; i++) {
        ll x = n / i, j = n / x;//i是左端点,j是右端点,x是取值
        ans += (j - i + 1) * x;
        i = j;//跳过这一段
    }
    cout << ans << '\n';
    return 0;
} 

调和数

调和数定义为\(\large H_{n}=\sum_{k=1}^{n}\frac{1}{k}\),是发散的。

关于调和数有以下结论:

\[H_n = \ln n + \gamma + o(1)\]

\(o(1)\)会随着\(n\)的增大不断趋近于\(0\)

这可以推出一个常见的时间复杂度:

\[\large \sum_{d=1}^{n}\lfloor\frac{n}{d}\rfloor=\Theta(n\log n)\]

### 算数基本定理

唯一分解定理

任意一个正整数\(n\)都可以表示成素数的乘积的形式:

\[\large n=p_1^{\alpha_1}p_2^{\alpha_2}…p_s^{\alpha_s}\]

式子里的\(p_1,…,p_s\)是不同的素数。在不计次序的情况下,这一表达是唯一的。

与互质的关系:两个数是互质的当且仅当它们没有共同的素因子

可以用试除法来求

求素数

求不超过\(n\)的所有的素数可以用埃氏筛、欧拉筛等,关于素数具体见这里 click here

这里看一下\(O(n)\)的欧拉筛(\(\text{Euler}\)筛法)

它的思想是枚举所有数的最小质因子,从而使每个数只被访问一次,所以是\(O(n)\)

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

const int A = 1e5 + 11;
const int B = 2e7 + 11;

int n, m, vis[B], prime[B], cnt;
//vis表示是否为质数,prime数组存质数

//线性筛 
void prepare() {
    vis[0] = 1, vis[1] = 1;
    for(int i = 2; i <= n; i++) {
        if(!vis[i]) prime[++cnt] = i;
        for(int j = 1; j <= cnt && i * prime[j] <= n; j++) {
            vis[i * prime[j]] = 1;
            if(i % prime[j] == 0) break;
        }
    }
}

int main() {
    prepare();  
    return 0;
}

素数计数函数

\(\small \sim\)指渐进

令素数计数函数\(\pi(n)\)表示不超过\(n\)的素数个数,有如下的素数定理:

\[\large \pi(n)\sim\frac{n}{\ln n}\]

推论:

  1. \(n\)附近的素数密度近似是\(1/\ln n\)
  2. \(n\)个素数\(p_n\sim n \ln n\)

有正整数的一部分,取一个正整数的无穷子集,然后考虑他们的倒数之和,加起来可能是有限的,比如说\(2\)的幂的倒数,加起来是一个有限的数,即\(\frac{1}{2}+\frac{1}{4}+\frac{1}{8}+…+\frac{1}{2^{n}}\),他们的和是\(1\)

把数看做字符串,考虑一个数字\(s\)\(s\)是一个数字串,考虑所有不包含\(s\)的正整数,比如说不包含\(1\)的正整数,看起来是非常多的,但其实是个有限的数。

素数的倒数和是发散的。(这是一个事实,但在\(\text{OI}\)里没有应用)

素数计数

显然可以利用\(\text{Euler}\)筛算出\(n\)以内的所有素数,进而得到\(\pi(n)\)

用一个类似极性函数求和的筛法可以达到\(O(\frac{n^{3/4}}{\log n})\)的复杂度。

先进的做法似乎可以达到\(O(\frac{n^{2/3}}{\log n})\)

然而我一直在抄课件……这个东西老师也咕咕咕了,自己去搜吧,反正我不会

数论函数

概念:定义域为正整数,值域是复数的子集的函数称为数论函数。

\(\text{OI}\)中研究的数论函数的值一般也是整数。

积性函数

\(f\)是数论函数,若对任意互质的正整数\(a,b\),都有\(f(ab)=f(a)f(b)\),则称\(f\)是积性函数。(积是乘积的意思)

若对任意的正整数\(a,b\),都有\(f(ab)=f(a)f(b)\),则称\(f\)是完全积性函数

\(f\)是积性函数,且\(n=p_1^{\alpha_1}p_2^{\alpha_2}…p_s^{\alpha_s}\)\(n\)的标准分解,则有

\[f(n)=f(p_1^{\alpha_1})f(p_2^{\alpha_2})…f(p_s^{\alpha_s})\]

因此研究积性函数\(f\)可以转化为研究\(f(p^{\alpha})\),即\(f\)在素数和素数的幂上的取值。

积性函数求值

\(f\)是积性函数,为求\(f(n)\),可以对\(n\)分解素因子,然后计算所有的\(f(p^{\alpha})\)乘起来。

(咕咕咕……明天继续)

猜你喜欢

转载自www.cnblogs.com/loceaner/p/12237712.html