Login to join training plan
欧拉函数
φ(x)=k=1∑x[gcd(k,x)=1]
φ(x) 表示 1∼x−1 中与 x 互质的数。
欧拉函数是一个积性函数,但不是完全积性函数。
- 积性函数:f(1)=1,且当 gcd(x,y)=1 时,f(xy)=f(x)f(y)。
- 完全积性函数:f(1)=1,且 ∀x,y,f(xy)=f(x)f(y)。
性质
- φ(n)=n×p∣n,p is a prime∏pp−1
- φ(pk)=pk−pk−1
- gcd(i,n)=1∑i=2φ(n)×n
欧拉定理
对于一个模数 p,p 可以不是质数,但 k 与 p 互质,有 kφ(p)≡1(modp)。
- 求逆元:k1≡kφ(p)−1(modp)。
- 降低指数:ka≡kamodφ(p)(modp)。
扩展欧拉定理:p 可以不是质数,k 可以不与 p 互质。
ka≡{kakamodφ(p)+φ(p)a<φ(p)a≥φ(p)(modp)
求解
- Θ(n) 求一个 φ(n):
φ(n)=n×p∣n,p is a prime∏pp−1
- Θ(n) 求 φ(1)∼φ(n):
线性筛法。
int p[N];
bool st[N];
int phi[N];
void prime(int n)
{
phi[1] = 1;
for (int i = 2; i <= n; i ++ )
{
if (!st[i]) p[ ++ cnt] = i, phi[i] = i - 1;
for (int j = 1; p[j] <= n / i; j ++ )
{
st[p[j] * i] = 1;
if (i % p[j]) phi[i * p[j]] = phi[i] * p[j];
else
{
phi[i * p[j]] = phi[i] * (p[j] - 1);
break;
}
}
}
}
除数函数
σk(x)=d∣x∑dk。
k=0 时,含义为约数个数和。
k=1 时,含义为约数和。
除数函数全部是积性函数,但不是完全积性函数。
莫比乌斯函数
https://oi-wiki.org//math/number-theory/mobius/
https://www.luogu.com.cn/problem/P3455
欧几里得算法
求 gcd(a,b),辗转相除法。
int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
扩展欧几里得算法
求二元一次方程 ax+by=c 的解。
裴蜀定理:有解当且仅当 gcd(a,b)∣c。
如果 (x1,y1) 是一组解,那么 (x1+gb,y1−ga) 也是一组解。
如何得到一组任意解?
a1x1+b1y1=c
a2x2+b2y2=c
a2=b1, a2=a1modb1=a1−⌊b1a1⌋×b1
b1x2+(a1−⌊b1a1⌋×b1×y2)
b1x2+a1y2−a1−⌊b1a1⌋×b1×y2
......
求逆元
求 x,使得 x×kmodp=1。
也就是求 x×k+y×p=1。
于是就转化成了二元一次方程,求的是 x 在 [0,p−1] 区间内的一个解。
这个方法对 p 的素性没有要求。
筛质数
- 埃氏筛:Θ(n×ln(n))。
从小到大枚举每一个数字,如果之前被筛掉了,那么不是质数,否则就是质数。
无论当前的 i 是不是质数,枚举已经筛出来的每一个质数 pmj,把 i×pmj 筛掉,直到 i×pmj 大于上街 n 或者质数枚举完毕结束。
对于每一个数字 x,仅在 pmj′×i′ 的时候被筛掉,其中 pmj′ 是 x 的最小质因数。
在枚举 pm 的时候,加一句判断,如果 pmj∣i,那说明 i 的最小质因子为 pmj,之后再枚举 pm 就不满足要求了,直接 break
。
int p[N];
bool st[N];
void prime(int n)
{
for (int i = 2; i <= n; i ++ )
{
if (!st[i]) p[ ++ cnt] = i;
for (int j = 1; p[j] <= n / i; j ++ )
{
st[p[j] * i] = 1;
if (i % p[j] == 0) break;
}
}
}
中国剩余定理
有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?
给定 ai,pi,其中 pi 两两互质,求 x,满足:
⎩⎨⎧x≡a1(modp1)x≡a2(modp2)…………x≡an(modpn)
定义一个 b 数组,使得 bi=piP×ai×(piP)pi−2。
EXCRT
如果 pi 不两两互质,合并方程。最终得到:
x≡AmodP⟺x=A+kP(k∈Z)
这样就能将两个式子 x≡a1(modp1) 和 x≡a2(modp2) 合并成了 x≡a12modp12,其中 p12=lcm(p1,p2)=p1p2,a12 是原方程组的任意一个特解。
使用扩展欧几里得算法求解特解。
如果两两互质,可以直接求逆元得到 k1。