目录
整除理论
素数定理
令 π(n) 为小于等于 n 的素数个数,有 π(n)=Θ(n/lnn)
算数基本定理
每个正整数都可以唯一的表示成质数的乘积,其中质数因子从小到大依次出现(这里的“乘积”可以有0个、1个或多个质因子)
素数判定
单点 O()
for(int i=1;i<=sqrt(n);i++)
{
if(n%i==0)
{
p[n]=0;
}
}
p[n]=1;
埃氏筛 O(nloglogn)
for(int i=2;i<=n;i++)
{
p[i]=1;
}
for(int i=2;i<=n;i++)
{
if(p[i])
{
for(int j=i*2;j<=n;j+=i)
{
p[j]=0;
}
}
}
线性筛 O(n)
for(int i=2;i<=n;i++)
{
if(!vis[i])
{
p[++pn]=i;
}
for(int j=1;i*p[j]<=n;j++)
{
vis[i*p[j]]=1;
if(i%p[j]==0)
{
break;
}
}
}
整除理论
对于整数a和b,若存在整数q使得aq=b,那么称a为b的约数,b是a的倍数,记作a|b
- 设a和b是两个整数,如果且,则称d是a与b的公因子
- 设a和b是两个不全为0的整数,称a与b的公因子中最大的为a与b的最大公因子,或最大公约数,记作或
- 设a和b是两个非零整数,称a与b的最小的正公倍数为a与b的最小公倍数,记作或
- 若, 则
- 若, 则
- 设m,a,b是正整数,则
- 首先将a和b进行素因子分解成
- 这里是不同的素数,则有
辗转相除法 O(log(a+b))
int gcd(int x,int y)
{
return y==0?x:gcd(y,x%y);
}
同余理论
- 整数a,b满足,那么称a和b在模m下同余,记作
- 对于,若,,,则
- 对于,有
- 对于质数m1和m2,若,则
exgcd O(log(a+b))
求解线性不定方程
void exgcd(int a,int b,int &g,int &x,int &y)
{
if(!b)
{
x=1,y=0,g=a;
}
else
{
exgcd(b,a%b,g,y,x);
y-=x*(a/b);
}
}
证明过程:
- 求
- 可以看出有解的充要条件是
乘法逆元
- 对于正整数a,若存在s使
- 记s是a在模m下的逆元,即
- a存在逆元的充要条件
费马小定理
若p是质数,则对于任意整数a有
威尔逊定理
若p是质数,则有
线性推逆元 O(n)
- 若
- (m是质数)
inv[1]=1;
for(int i=2;i<=p;i++)
{
inv[i]=(p-p/i)*inv[p%i]%p;
}
a在模m下的乘法逆元
- m是质数:费马小定理,线性推逆元
- m不是质数:exgcd
例题
给定n个数,求其在模p意义下的逆元,n<2e7,p<1e9,保证p为质数
- 设为的前缀积(即)
中国剩余定理
对于n个同余方程形成的同余方程组,求最小的x,其中两两互质
设,,
则其解为
扩展中国剩余定理
- 对于 n 个同余方程 x ≡r_i (mod m_i) 形成的同余方程组,求最小的 x。其中 m_i 不满足两两互质。
- 考虑已经求得前 j-1 个方程的解 R,前 j-1 个方程的模数的 lcm 是 M,现在则考虑 , ,联立用 exgcd 解 A 和 B 即可。
- “扩展CRT”“扩展中国剩余定理”,其实就是⽤exgcd⼀个个合并这些同余⽅程。
- 以合并两个同余⽅程 为例,⽅程组有解的充要条件是, 此时x在模意义下 有唯⼀解。
- 该⽅程组等价于
- 则
- exgcd求出、,可求出x在模意义下的 唯⼀解 。
欧拉函数
- ⼀个数x的欧拉函数φ(x)为⼩于x的正整数中与x互质的数的个数
- 特别地,φ(1) = 1。
- 欧拉函数的一种求法: 其中是x的所有质因数。
- 欧拉函数的性质
- 积性函数!
积性函数:若对任意互质的两个数m和n有,则 f(x)是积性函数。若对任意两个数(不要求互质)都有 ,则f(x)是完全积性函数。
2.对质数p, 。
3. ⼩于n的数中,与n互质的数之和为。
4. n的所有因数的欧拉函数之和等于n
- 如何快速求欧拉函数
- 可以发现欧拉函数对乘法有很好的性质
- m为n最小的质因子
- 这启发我们用线性筛求欧拉函数
for(int i=2;i<=n;i++)
{
if(!vis[i])
{
p[++pn]=i;
phi[i]=i-;
}
for(int j=1;i*p[j]<=n;j++)
{
vis[i*p[j]]=1;
if(i%p[j]==0)
{
phi[i*p[j]]=phi[i]*p[j];
break;
}
phi[i*p[j]]=phi[i]*phi[p[j]];
}
}
莫比乌斯函数
- 可以发现线性筛除了可以筛素数,还有别的应⽤——O(n)筛积性函数!
- 尝试:莫比乌斯函数μ(n)定义如下图,O(n)求1~n的莫比乌斯函数。
//线性筛莫比乌斯函数
mu[1]=1;
for(int i=2;i<=n;i++)
{
if(!vis[i])
{
p[++pn]=i;
phi[i]=-1;
}
for(int j=1;i*p[j]<=n;j++)
{
vis[i*p[j]]=1;
if(i%p[j]==0)
{
mu[i*p[j]]=0;
break;
}
phi[i*p[j]]=-phi[i];
}
}
- 定义函数d(x)为x的因数个数,O(n)求1~n的因数个数
//d[x]:x中的因数个数
//e[x]:x中最小质因数的次数
d[1]=1;
for(int i=2;i<=n;i++)
{
if(!vis[i])
{
p[++pn]=i;
d[i]=2;
e[i]=1;
}
for(int j=1;j<=pn&&i*p[j]<=n;j++)
{
vis[i*p[j]]=1;
if(i%p[j]==0)
{
e[i*p[j]]=e[i]+1;
d[i*p[j]]=d[i]/(e[i]+1)*(e[i]+2);
break;
}
else
{
e[i*p[j]]=1;
d[i*p[j]]=d[i]*2;
}
}
}
欧拉定理
- 欧拉定理:若 m 是正整数, ,则有
- 可以看出费马小定理是欧拉定理的特殊情况
证明:
扩展欧拉定理
若m,n是正整数,,则有
Lucas定理
给定质数p,求
相当于把n和k拆成p进制数,然后每一位对应求组合数,最后再乘起来