数论总结

news/2024/9/12 15:19:25/文章来源:https://www.cnblogs.com/laoshan-plus/p/18367209

数学是毒瘤


基础数论总结。

数论题的代码都是一个个板子拼起来的,本博客只放板子。

声明:本博客中出现的所有代码,都视为加入了 #define int long long

数论题的特点

  1. 题目大意简洁易懂。但有的题还是会古舟一堆

  2. 码量小,全是板子

  3. 极其难想,需要手推公式

  4. long long 是标配


筛法

筛法可以储存所有的质数,也可以 \(O(1)\) 判断质数。

埃氏筛法

时间复杂度 \(O(N\log\log N)\)

vector<int> pri;
bool is_prime[MAXN];void primes(int n) {for (int i = 2; i <= n; i++) {if (is_prime[i]) continue;pri.push_back(i);for (int j = i; j <= n / i; j++) is_prime[i * j] = 1;}
}

线性筛法

线性筛法,也称欧拉筛法,时间复杂度 \(O(N)\)

vector<int> pri;
bool is_prime[MAXN];void primes(int n) {for (auto &x : is_prime) x = 1;for (int i = 2; i <= n; i++) {if (is_prime[i]) pri.push_back(i);for (auto j : pri) {if (i * j > n) break;is_prime[i * j] = 0;if (i % j == 0) break;}}
}

分解质因数

任何一个大于 \(1\) 的正整数 \(N\) 都能唯一分解为有限个质数的乘积,可写作:\(N=p_1^{c_1}p_2^{c_2}\cdots p_m^{c_m}\)

其中 \(c_i\) 都是正整数,\(p_i\) 都是质数,且满足 \(p_1<p_2<\cdots<p_m\)

算术基本定理的推论

\(N\) 的正约数个数为:

\[(c_1+1)(c_2+1)\cdots(c_m+1)=\prod_{i=1}^m\left(c_i+1\right) \]

\(N\) 的所有正约数的和为:

\[(1+p_1+p_1^2+\cdots+p_1^{c_1})\cdots(1+p_m+p_m^2+\cdots p_m^{c_m})=\prod_{i=1}^m\left(\sum_{j=0}^{c_i}p_i^j\right) \]

试除法分解质因数

int m, p[MAXN], c[MAXN];void divide(int n) {m = 0;for (int i = 2; i * i <= n; i++)if (n % i == 0) {p[++m] = i, c[m] = 0;while (n % i == 0) {n /= i;c[m]++;}}if (n > 1) p[++m] = n, c[m] = 1;
}

最大公约数

欧几里得算法

即辗转相除法,时间复杂度 \(O(\log N)\)

inline int gcd(int a, int b) {if (b == 0) return a;return gcd(b, a % b);
}

欧拉函数

定义

定义 \(\varphi(n)\) 表示的是小于等于 \(n\)\(n\) 互质的数的个数。

例如 \(\varphi(1)=1\)

\(n\) 是质数的时候,显然有 \(\varphi(n) = n - 1\)

2024/7/11 upd. 欧拉函数的公式如下:(其中 \(p_{1\dots m}\)\(x\) 的所有质因数)

\[\varphi(n)=n\times\prod_{i=1}^m\left(1-\frac1{p_i}\right) \]

单个数求欧拉函数

inline int euler_phi(int x) {int res = x;for (int i = 2; i * i <= x; i++)if (x % i == 0) {res = res / i * (i - 1);while (x % i == 0) x /= i;}if (x > 1) res = res / x * (x - 1);return res;
}

筛法求欧拉函数

利用线性筛法可以快速求出多个数的欧拉函数值。

constexpr int MAXN = 5e6 + 5;
vector<int> prime;
int phi[MAXN];void euler(int n) {phi[1] = 1;for (int i = 2; i <= n; i++) {if (!phi[i]) {prime.push_back(i);phi[i] = i - 1;}for (auto j : prime) {if (i * j > n) break;if (i % j != 0)phi[i * j] = phi[i] * phi[j];else {phi[i * j] = phi[i] * j;break;}}}
}

扩展欧拉定理

欧拉定理

若正整数 \(a,n\) 互质,则 \(a^{\varphi(n)}\equiv 1\pmod{n}\)

欧拉定理的推论

若正整数 \(a,n\) 互质,则对于任意正整数 \(b\),有 \(a^b\equiv a^{b\bmod\varphi(n)}\pmod{n}\)

\(a,n\) 不一定互质且 \(b>\varphi(n)\) 时,有 \(a^b\equiv a^{(b\bmod\varphi(n))+\varphi(n)}\pmod{n}\)

扩展欧拉定理可用于解决大整数乘方取模问题。

扩展欧几里得

裴蜀定理

对于任意整数 \(a,b\),存在一对整数 \(x,y\),满足 \(ax+by=\gcd(a,b)\)

扩展欧几里得算法可以在求得 \(\gcd(a,b)\) 的前提下,求解形如 \(ax+by=\gcd(a,b)\) 的方程的解。

由于形如 \(ax\equiv b\pmod p\) 的线性同余方程可以改写为 \(ax+pk=b\) 的形式,所以线性同余方程也可用扩展欧几里得求解。当然,由裴蜀定理,有整数解的充要条件为 \(\boldsymbol{\gcd(a,p)\mid b}\)。线性同余方程也可用逆元求解。计算 \(a\) 的逆元,然后两边同除以 \(a\) 的逆元可得到一个解。

扩展欧几里得算法同样可以求单个数的乘法逆元。

int exgcd(int a, int b, int &x, int &y) {if (b == 0) {x = 1;y = 0;return a;}int res = exgcd(b, a % b, x, y);int t = x;x = y;y = t - a / b * y;return res;
}

乘法逆元

费马小定理

\(p\) 是质数且 \(a,p\) 互质,则 \(a^{p-1}\equiv 1\pmod{p}\)

另一个形式:对于任意整数 \(a\),有 \(a^p\equiv a\pmod{p}\)

定义

如果一个线性同余方程 \(ax \equiv 1 \pmod b\),则 \(x\) 称为 \(a \bmod b\) 的逆元,记作 \(a^{-1}\pmod{b}\)其实就是倒数

\(\boldsymbol b\) 是质数且 \(\boldsymbol{a<b}\),由费马小定理,易得 \(\boldsymbol{a^{b-2}}\) 即为乘法逆元。

如果只是保证 \(a,b\) 互质,则我们可以通过求解同余方程 \(ax\equiv 1\pmod b\) 得到乘法逆元。

扩展欧几里得求单个数的乘法逆元

参见上文,不再赘述。

费马小定理求逆元

参见上文,代码如下:

inv[0] = 1;
for (int i = 1; i < MAXN; i++) inv[i] = power(i, MOD - 2, MOD);

时间复杂度 \(O(N\log N)\),可以在数据规模不大于 \(10^6\) 时求出逆元。

线性求逆元

P3811 乘法逆元

\(1\dots n\) 中所有整数在模 \(p\) 意义下的乘法逆元。

\(1\le n\le 3\times 10^6\)\(n<p<20000528\),保证 \(p\) 为质数。

#include <bits/stdc++.h>
#define int long long
using namespace std;constexpr int MAXN = 3e6 + 5;
int n, p, inv[MAXN];signed main() {cin >> n >> p;inv[1] = 1;for (int i = 2; i <= n; i++) inv[i] = (p - p / i) * inv[p % i] % p;for (int i = 1; i <= n; i++) cout << inv[i] << '\n';return 0;
}

中国剩余定理

引入

「物不知数」问题:有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?

定义

中国剩余定理 (Chinese Remainder Theorem, CRT) 可求解如下形式的一元线性同余方程组(其中 \(n_1, n_2, \cdots, n_k\) 两两互质):

\[\begin{cases} x &\equiv a_1 \pmod {n_1} \\ x &\equiv a_2 \pmod {n_2} \\&\vdots \\ x &\equiv a_k \pmod {n_k} \\ \end{cases} \]

上面的「物不知数」问题就是一元线性同余方程组的一个实例。

过程

  1. 计算所有模数的积 \(n\)
  2. 对于第 \(i\) 个方程:
    • 计算 \(m_i=n/n_i\)
    • 计算 \(m_i\) 在模 \(n_i\) 意义下的逆元 \(m_i^{-1}\)
    • 计算 \(c_i=m_im_i^{-1}\)(不要对 \(\boldsymbol{n_i}\) 取模)
  3. 方程组在模 \(n\) 意义下的唯一解为:\(x=\sum_{i=1}^k a_ic_i \pmod n\)

实现

int crt(int k, int r[], int a[]) {int n = 1, ans = 0;for (int i = 1; i <= k; i++) n *= r[i];for (int i = 1; i <= k; i++) {int m = n / r[i], b, y;exgcd(m, r[i], b, y);ans = (ans + a[i] * m * b % n) % n;}return (ans % n + n) % n;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/783789.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

定位遇阻?合宙模组GNSS排障宝典01

使用合宙GNSS定位模组时,总有客户因为各种原因遇到无法定位的情况。本文总结了无法定位最常见的四种情况,希望能帮到有类似定位应用项目的朋友们,更快地排查出问题所在。使用合宙GNSS定位模组时,总有客户因为各种原因遇到无法定位的情况。 本文总结了无法定位最常见的四种情…

python入门教程(非常详细!3w+ 文字)

先序: 学习编程语言要先学个轮廓,刚开始只用学核心的部分,一些细节、不常用的内容先放着,现用现查即可;把常用的东西弄熟练了在慢慢补充。 1、 安装 Python 解释器 为什么需要安装 Python Python 语言本身是由解释器执行的,因此你需要在你的计算机上安装 Python 解释器。这…

cnetos 9 安装巨坑!!! ssh无法登录

不管任何软件登录 或任何形式的ssh登录 仅开启了密钥的登录 没有账号密码具体步骤:找到合适的插入位置:在 /etc/ssh/sshd_config 文件中查找类似以下的段落,然后在附近添加新配置:# Authentication: #PermitRootLogin prohibit-password #PasswordAuthentication no添加或修…

汉明距离(Hamming distance)

在图像信号处理中,汉明距离(Hamming distance)通常用于比较两个图像之间的差异程度。汉明距离原本是衡量两个等长字符串之间对应位置上不同字符的数量,但在图像处理中,它也可以用来比较两个图像的像素值差异。计算步骤 1、图像预处理:确保两个图像的尺寸相同,如果不同,…

遇到403 Forbidden ,服务器端查询后结果是http get查询字符串中包含非法字符

原文链接:https://blog.csdn.net/mm_hello11/article/details/84261672 报错解释: HTTP GET请求通过查询字符串(即URL中"?"后面的部分)传递参数。如果查询字符串包含非法字符,服务器可能会拒绝请求并返回错误,因为这些非法字符可能会破坏URL的格式或者服务器…

MAC (Multiply-Accumulate)

MAC (Multiply-Accumulate)

Xfce漫游(1) - Xfce与相关概念

用了好几年Xfce桌面了,但是从来没有仔细研究过Xfce底下相关的运行逻辑,最近才对相关的底层概念感兴趣并去尝试了解了一下,但是它的体系架构以及复杂的依赖关系令初来乍到者望而却步。没办法,写点什么方便理解吧。 这一系列文章主要是探讨Xfce底层实现的,不会过多聚焦于美化…

windows10清理缓存命令,windows10清理缓存命令是什么

在Windows 10系统中,清除缓存可以通过多种方法实现,但严格来说,并没有一个单一的“指令”可以一键清除所有类型的缓存。不过,我可以为你介绍几种常用的方法来清除不同类型的缓存。 一、使用磁盘清理工具 磁盘清理工具是Windows 10内置的一个非常实用的工具,可以帮助用户删…

问题:ETL中写入数据到Clickhouse抛出 Code: 27. DB::ParsingException: Cannot parse input

问题描述 问题:ETL中写入数据到Clickhouse抛出 Code: 27. DB::ParsingException: Cannot parse input 问题原因: 目标字段的长度和精度不足以容纳源字段 问题解决方法:案例1: 源是timestamp,目标是datetime修改结果: 创建目标表的时候选择高精度的字段类型案例2: 源是带…

CSS3第三天(盒子模型+浮动)

盒子模型 1.内边距padding 指定了高宽,再指定内边距,则会撑开盒子。 盒子未指定高宽(继承算未指定),则不会撑开盒子。 2.外边距margin 用于控制盒子之间的距离。同padding的简写方式。 margin-left左外边距 right top bottom 块级盒子水平居中,需满足两个条件:①盒子必须…

定位

浮动可以让多个块级盒子一行没有缝隙排列显示,经常用于横向排列盒子。 平铺 定位可以让盒子自由的在某个盒子内移动或者固定屏幕中某个位子,并且可以压住其他盒子。 叠积 定位:定位模式(position属性)+偏移量 position属性:static、relative、absolute、fixed top、botto…

Java基础语法笔记

Java基础语法 1.注释,标识符,关键字 注释line comment:// block comment:/* */ java doc:/** */ 标识符、关键字数据类型