数论算法
数论算法
快速乘
1 | ll mul(ll a,ll b,ll mod) |
同余系相关
Exgcd
存在
所以
递归求解,终止时必然有
解集为
1 | void exgcd(ll a,ll b,ll &x,ll &y) |
ExCRT
$$
\left{
$$
每次合并两个方程
存在
求解二元一次方程
设
可得新的方程为
1 | ll ExCRT(ll *a,ll *p,const int &n) |
ExBSGS
根据欧拉定理
可以在
但是对于一般情况
设
若
否则,若
由
继续分解直到
这时候需要特判
因为
考虑分块求解这个问题,设
xxxxxxxxxx Point get_nearest_point_on_segment(Point a,Line a1){ Point b=a1.s,c=a1.e; double t=dot(a-b,c-b)/dot(c-b,c-b); if(dcmp(t)!=-1&&dcmp(1-t)!=-1)return Vector(b.x+(c.x-b.x)*t,b.y+(c.y-b.y)*t); if(dist(a,b)<dist(a,c))return b; return c;}cpp
只需要将所有的 Hash
表中,再对所有
1 | int ExBSGS(int a,int b,int p) |
Lucas
首先可以观察得出
设
lucas
定理也可以表示为一下形式
可得
因为
得证。
1 | int lucas(int n,int m,int mod){if(n==0&&m==0)return 1;return lucas(n/mod,m/mod,mod)*1LL*C(n%mod,m%mod,mod)%mod;} |
Exlucas
这里的
根据唯一分解定理
若 lucas
求解,再使用CRT
合并。
否则需要求解子问题 CRT
合并。
只需要解决
考虑将
可以发现后面是模
前面的
复杂度
1 | ll mul(ll a,ll b,ll mod) |
二次剩余
无特殊说明
对于
则称
勒让德符号
欧拉判别准则
证明:
若
若
若
Cipolla
定理1
定理2
证明:
我们只考虑所有的
算法流程
- 判断给定的数
是否是二次剩余。 - 随机一个
,使其满足 是二次非剩余。 - 令
,取 为其中一个可行解。
证明:
1 | int mod,w; |
素数分解相关
Miller-Rabin
判断
根据费马小定理,当
而当
因此就有了一个想法:随机一些
但是,存在这样一类合数
二次探测定理
如果
可以发现对于合数,有一定概率不成立。
在检验时,如果
1 | ll mul(ll a,ll b,ll mod) |
递归改成递推,这样复杂度是
莫比乌斯反演
莫比乌斯反演函数
性质
莫比乌斯反演定理
若函数
则存在
证明:
考虑
推论:
若函数
则存在
证明:
考虑每个
这个推论可以很简单地用于求解类似
一些例题
基础的套路不在过多阐述。
Problem 1.
设
显然
由莫比乌斯反演的性质可得
枚举
这里可以直接数论分块
继续将这个式子变形, 考虑枚举
可以发现后面的
这样对于单次询问复杂度
Problem 2.
有一个结论
显然每个质因子
按照套路考虑枚举
所以
考虑设
显然
考虑线性筛筛出
这个显然可以数论分块,总复杂度
总结
一般来说莫比乌斯反演的题目,主要考虑化为
Min_25 筛
规定
其中
筛质数的答案
首先需要对每个
首先线性筛出
因为
所以本质上来说需要求解的是
考虑构造一个函数
其实不难发现
考虑如何求
考虑第
所以如果
否则
不难发现
边界条件
筛所有数的答案
如果分质数与合数讨论显然可以得到
前面一部分即为所有质数的贡献,而后面求合数的贡献,非常好理解就是暴力枚举
总复杂度
关于实现方面的细节
有一个性质
在这里如果使用 map
储存复杂度显然会变大,考虑到
举个简单的例子
1 |
|
杜教筛
常见积性函数
莫比乌斯反演函数。 欧拉函数 。 约数个数函数 约数个数和函数 恒等函数函数值恒为 元函数 单位函数
狄利克雷卷积
满足交换律,结合律,分配律。
不难发现存在
杜教筛
需要计算积性函数
记
考虑寻找到两个积性函数使得
考虑将
也就是说只要
例子
1 | int smu[maxn]; |
- Title: 数论算法
- Author: Reaepita
- Created at: 2022-09-09 19:47:59
- Updated at: 2023-08-06 15:21:37
- Link: https://harrybh.github.io/2022/09/09/数论总结/
- License: This work is licensed under CC BY-NC-SA 4.0.