NOIp 基础数论知识点总结
推荐阅读 NOIp 数学知识点总结: https://www.cnblogs.com/greyqz/p/maths.html
Basic
快速幂
int qpow(int x, int y) {
int res = 1;
for (; y; x = (ll)x * x % mod, y >>= 1)
if (y & 1) res = (ll)res * x % mod;
return res;
}
矩阵快速幂:
struct matrix {
ll m[100][100];
matrix operator * (matrix &a) {
matrix b;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) {
b.m[i][j] = 0;
for (int k = 0; k < n; k++)
b.m[i][j] = (b.m[i][j] + m[i][k] * a.m[k][j]) \% mod;
}
return b;
}
} s;
matrix mpow(matrix a, ll k) {
if (k == 1) return a;
a = mpow(a, k / 2);
if (k \% 2) return (a * a) * s;
else return a * a;
}
matrix a = mpow(s, p);
乘法逆元
众所周知, 在模意义下没有标准的除法. 为了表示乘法的逆运算, 我们定义:
在 \({\rm mod}\ p\) 意义下, \(x\) 的乘法逆元记为 \(x^{-1}\), 即 \(x\cdot x^{-1}\equiv 1\pmod p\).
由此我们得到 \(\displaystyle \frac{x}{y}\equiv x\cdot y^{-1}\pmod p\).
费马小定理:对于任意素数 \(p\), 有 \(a^{p-1}\equiv 1\pmod p\).
对费马小定理变形, 得 \(a\cdot a^{p-2}\equiv 1\pmod p\).
所以 \(a^{p-2}\) 即为 \(a\) 的乘法逆元. 对于非素数 \(p\), 不一定有乘法逆元.
由此, 使用快速幂求解乘法逆元:
inline int qpow(int n, int m, int mod) {
ll tot = 1;
for (ll k = n; m; k = k * k % mod, m >>= 1)
if (m & 1) tot = tot * k % mod;
return tot;
}
inline int inv(int x, int mod) {
return qpow(x, mod - 2);
}
拓展欧几里得算法用于在线性时间里求解关于 \(x,y\) 的方程 \(ax+by=\gcd(a,b)\) 的一组整数解.
当 \(b\) 为素数时, \(\gcd(a,b)=1\), 此时有 \(ax\equiv 1\pmod b\). 从而使用拓展欧几里得算法求解乘法逆元:
void exgcd(const int a, const int b, int &g, int &x, int &y) {
if (!b) g = a, x = 1, y = 0;
else exgcd(b, a % b, g, y, x), y -= x * (a / b);
}
inline int inv(const int num) {
int g, x, y;
exgcd(num, MOD, g, x, y);
return ((x % MOD) + MOD) % MOD;
}
以上时间复杂度均为 \(O(\log a)\).
整除
最大公约数
辗转相除法(欧几里得算法):
int gcd(int x, int y) {
return !y ? x : gcd(y, x % y);
}
大整数意义下的快速更相减损术:
bint kgcd(bint a, bint b) {
if (b == 0) return b;
if (a < b) return kgcd(b, a);
if (!(a&1) && !(b&1)) return kgcd(a>>1, b>>1) << 1;
else if (!(b&1)) return kgcd(a, b>>1);
else if (!(a&1)) return kgcd(a>>1, b);
else return kgcd(b, a-b);
}
最小公倍数:\(\text{lcm}( a, b ) = a \div \gcd ( a, b ) \times b\). (先除后乘防爆 int. )
线性筛法
素数分布定理:对于不大于 \(n\) 的自然数集合, 素数个数 \(\pi(x)\sim\displaystyle\frac{n}{\ln{n}}\).
Euler 筛法(一种最常见的线性筛法):
基本思想:每个数只被最小的质因子筛一次, 即对于 \(a\) 是质数, \(b\) 的最小质因子不小于 \(a\) 的整数对 \(a, b\), 标记 \(ab\) 为合数实现:先枚举 \(b\), 再枚举 \(a\), 枚举到 \(a|b\) 时结束.
int p[N/lnN]; // 素数分布定理
bool com[N];
for (int i=2; i<=n; i++) {
if (!com[i]) p[++p[0]]=i;
for (int j=1; j<=p[0] && i*p[j]<=n; j++) {
com[i*p[j]]=true;
if (i%p[j]==0) break;
}
}
素因数分解(筛法优化):
int p[N/lnN], mfac[N];
for (int i=2; i<=n; i++) {
if (!mfac[i]) p[++p[0]]=i;
for (int j=1; j<=p[0] && i*p[j]<=n; j++) {
mfac[i*p[j]]=p[j];
if (i%p[j]==0) break;
}
}
int fac[2 * sqrtN]; // 算术基本定理的推论
while (x > 1) {
fac[++fac[0]] = mfac[x];
x /= mfac[x];
}
数论函数
Bézout 定理:设 \(a, b\in \mathbf{Z}\), \((a, b) = d\), 存在 \(u,v\), 使得 \(ua+vb=d\).
算术基本定理(整数唯一分解定理):对于正整数 \(a\), 等式 \(a=p_1^{e_1} p_2^{e_2}\cdots p_n^{e_n}\) 唯一确定.
积性函数:对于 \((m,n)=1\), \(m,n∈\mathbf{N}^*\), 有 \(f(mn)=f(m)f(n)\). 要么 \(f(n)=0, \forall n\in \mathbf{N}^*\), 要么 \(f(1)=1\).
完全积性函数:对于一切 \(m, n\in\mathbf{N}^*\), 有 \(f(mn)=f(m)f(n)\).
Möbius 函数:
\]
除数函数 \(\tau(n)\):正整数 \(n\) 的正因数个数.
\]
其中 \(n=p_1^{e_1} p_2^{e_2}\cdots p_k^{e_k}\) (唯一确定).
除数和函数:
\]
其中 \(n=p_1^{e_1} p_2^{e_2}\cdots p_k^{e_k}\) (唯一确定). 积性函数.
Euler 函数 \(\varphi(n)\):不超过正整数 \(n\) 的正整数 \(1,2,3,\ldots ,n-1\) 中与 \(n\) 互质的数的个数. 积性函数. \(\varphi(p)=p-1\).
\]
void euler(int n) {
for (int i=2; i<=n; ++i) phi[i]=i;
for (int i=2; i<=n; ++i) if (phi[i]==i)
for (int j=i; j<=n; j+=i) phi[j]=phi[j]/i*(i-1);
}
取整函数
Gauss 函数 \([x]\):不大于 \(x\) 的最大整数. 又称整数部分.
一般地, 地板函数 $ \lfloor x\rfloor=[x] $, 天花板函数 $ \displaystyle \lceil x\rceil=\begin{cases} [x], & x\in \mathbf{Z}, \\ [x]+1, & x\notin \mathbf{Z}\end{cases} $, 小数部分 $ \lbrace x\rbrace=x-[x] $.
常用性质:
\]
任取 $ x\in\mathbf{R} $, 都有 $ \displaystyle\left[x\right]+\left[x+\frac{1}{2}\right]=\left[2x\right] $.
\]
\]
C++ 的默认取整方式为 向 0 取整。注意与取整函数的区别。
线性同余方程
拓展欧几里得算法:
void exgcd(const int a, const int b, int &g, int &x, int &y) {
if (!b) g=a, x=1, y=0;
else exgcd(b, a%b, g, y, x), y -= x*(a/b);
}
若方程 \(ax+by=c\) (\(a,b,c\in\mathbf{Z}\)) 的一组整数解为 \((x_0,y_0)\), 则它的任意整数解可以写成 \((x_0+kb',y_0-ka')\), 其中 \(\displaystyle a'=\frac{a}{\gcd(a,b)}\), \(\displaystyle b'=\frac{b}{\gcd(a,b)}\), \(\displaystyle k\in\mathbf{Z}\).
模线性方程组:
解方程 \(ax\equiv b\pmod n\): \(ax-b\) 即为 \(n\) 的倍数. 设 \(ax-b=ny\), 移项得 \(ax-ny=b\), 解线性同余方程即可.
NOIp 基础数论知识点总结的更多相关文章
- 数论知识点总结(noip范围)
数论知识点: 约数个数和约数和公式(例题:POJ1845 分治思想): 质因数分解 p1^k1xp2^k2xp3^k3...pn^kn 约数个数和:(1+k1)(1+k2)...(1+kn) 所有约数 ...
- Java---常用基础面试知识点
综合网上的一点资源,给大家整理了一些Java常用的基础面试知识点,希望能帮助到刚开始学习或正在学习的学员. 1.抽象 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方 ...
- noip级别数论?
TAT快noip了才开始去接触数论(真心不敢学..)这里做一下整理吧(都是些定义之类的东西= =) 欧几里德:gcd(a,b)=gcd(b,a%b);具体证明见百科? 扩展欧几里德: 求a*x+b*y ...
- LightOJ1214 Large Division 基础数论+同余定理
Given two integers, a and b, you should check whether a is divisible by b or not. We know that an in ...
- HDU-1576 A/B 基础数论+解题报告
HDU-1576 A/B 基础数论+解题报告 题意 求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973) (我们给定的A必能被B整除,且gcd(B,9973) = 1). 输入 数据 ...
- Java 基础常见知识点&面试题总结(中),2022 最新版!| JavaGuide
你好,我是 Guide.秋招即将到来,我对 JavaGuide 的内容进行了重构完善,公众号同步一下最新更新,希望能够帮助你. 上篇:Java 基础常见知识点&面试题总结(上),2022 最新 ...
- Java 基础常见知识点&面试题总结(下),2022 最新版!
你好,我是 Guide.秋招即将到来,我对 JavaGuide 的内容进行了重构完善,同步一下最新更新,希望能够帮助你. 前两篇: Java 基础常见知识点&面试题总结(上),2022 最新版 ...
- Contest2161 - 2019-3-21 高一noip基础知识点 测试4 题解版
传送门 预计得分:100+100+100+10=310 实际得分:100+0+82+10=192 你们基础知识不行啊——by wxg T1 一看数据范围就是搜索 但是不能因为数据范围就断送了dp的心 ...
- Contest2195 - 2019-4-25 高一noip基础知识点 测试8 题解版
(因为david_alwal太懒了,所以本期题解作者为Th Au K,码风不同请自行适应) 传送门 T1 BFS?贪心?我也说不清 反正就是对每一个“#”搜一下他的旁边有没有“#”就行了 代码 T2 ...
随机推荐
- layui框架中layer父子页面交互的方法分析
本文实例讲述了layui框架中layer父子页面交互的方法.分享给大家供大家参考,具体如下: layer是一款近年来备受青睐的web弹层组件,官网地址是:http://layer.layui.com/ ...
- lvs三种负载均衡模式
lvs模式 lvs nat模式 地址转换 nat模式 地址转发 ,数据全部集中在lvs处理,lvs压力大 lvs ip-tun模式 ip隧道 与nat模式差不多,差别有了隧道封装,轮询调度给后端服务器 ...
- Java实验报告(一)&&第三周学习总结
实验报告(一) 1. 打印输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其中各位数字立方和等于该数本身.例如,153是一个“水仙花数”. 源代码: public class Main { p ...
- GitHub Pages建立第一个静态页面
1.创建仓库 创建仓库点击右上角的加号,选择newrepository.然后对仓库信息进行设置.注意箭头标识的几个地方.仓库名必须是http://username.github.io的形式.必须勾选p ...
- 2018年牛客多校寒假 第四场 F (call to your teacher) (图的连通性)
题目链接 传送门:https://ac.nowcoder.com/acm/contest/76/F 思路: 题目的意思就是判断图的连通性可以用可达性矩阵来求,至于图的存储可以用邻接矩阵来储存,求出来可 ...
- [BNDSOJ] #1106代码
#include<bits/stdc++.h> using namespace std; ]; ][]; int n; bool check(int i,int j) { ]==]==]= ...
- HDU-1754 I Hate It(线段树,区间最大值)
很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老师 ...
- HDU-1394 Minimum Inversion Number (逆序数,线段树或树状数组)
The inversion number of a given number sequence a1, a2, ..., an is the number of pairs (ai, aj) that ...
- c# ASP.NET MVC easyui-filebox 图片上传和显示
原文:https://www.cnblogs.com/huatao/p/4727398.html https://www.cnblogs.com/weiweithe/p/4363458.html 表单 ...
- C# 委托和事件 实现窗体间的通信
例子 : 点击form1上的按钮打开form2窗口,在form2窗体中的文本框中输入一个值后,在点击form2窗体中按钮,在form2中的文本框中输入的值也会在form1中的文本框中出现. form1 ...