前言

这几天简单研究一下数论,以后可能就再也不会这么再看了。

PART 1

前置知识

  • 带余除法与整除
  • 约数与质数
  • 算术基本定理
  • 整除
  • 公约数,公倍数
  • 欧几里得算法(gcd)

裴蜀定理

(a, b)|d(a,b)d 等价于 存在整数 u, vu,v 使得ua + vb = dua+vb=d。

扩展欧几里得(exgcd)

做法与 gcd 类似,递归求解即可。

void Exgcd(ll a, ll b, ll &x, ll &y) 
{
    if (!b) x=1,y=0;
    else Exgcd(b,a%b,y,x),y-=a/b*x;
}

逆元

求 a^{-1}\bmod pa1modp。

  1. 当 pp 是质数,费马小定理得 a^{-1}=a^{p-2}a1=ap2。
  2. 当 (a,m)=1(a,m)=1,欧拉定理得 a^{-1}=a^{\phi(p)-1}a1=aϕ(p)1。
  • 求阶乘逆元

先处理 n!n! 的逆元,往前推即可。

  • 求 1\sim n1n 逆元
inv[1]=1;
for (int i=2;i<=n;i++) 
    inv[i]=(mod-mod/i)*inv[mod%i]%mod;
  • 求 a_1,a_2...a_na1,a2...an 逆元

记 f_i = a_i\times f_{i-1} \bmod pfi=ai×fi1modp,g_i = f_i^{−1} \bmod pgi=fi1modp。

容易发现 g_i = g_{i+1} \times a_{i+1}gi=gi+1×ai+1a_i^{−1} = f_{i−1} \times g_iai1=fi1×gi 然后递推即可。

线性同余方程

ax ≡ b \pmod maxb(modm) 与 ax + my = bax+my=b 两者等价。

中国剩余定理(CRT)

解方程 x ≡ a_i \ (\text{mod} \ m_i)\ (1\le i\le k)xai (mod mi) (1ik)。保证 m_imi 两两互质。

x ≡ \sum_{i=1}^k M_i \times N_i \times a_i\ (\text{mod} \ M)xi=1kMi×Ni×ai (mod M)。

其中 M = ∏_{i=1}^k m_iM=i=1kmiM_i = \dfrac{M}{m_i}Mi=miM ,N_i ≡ M_i^{-1} \ (\text{mod} \ m_i)NiMi1 (mod mi)。

扩展中国剩余定理(exCRT)

\begin{cases}x\equiv a\pmod{b}\\x\equiv c\pmod{d}\end{cases}{xa(modb)xc(modd)

推出 bt\equiv c-a\pmod{d}btca(modd),解出 t\equiv t_0\pmod{\dfrac{d}{(b,d)}}tt0(mod(b,d)d),代入解出 x\equiv x_0\pmod{[b,d]}xx0(mod[b,d])。

注意,一般对于合数等一些不好处理的情况时,可以考虑分解成若干个素数的幂,然后用解线性同余方程组合并。

扩展欧拉定理

a^{c} \equiv \begin {cases}a^{c \mod \varphi(m)}&gcd(a,m)=1\\a^c&gcd(a,m)\not=1 \land c\leq \varphi(m) \\ a^{c\mod\varphi(m)+\varphi(m)}&gcd(a,m)\not=1\land \varphi(m) \leq c\end{cases}acacmodφ(m)acacmodφ(m)+φ(m)gcd(a,m)=1gcd(a,m)=1cφ(m)gcd(a,m)=1φ(m)c

卢卡斯定理

(^{tp+r}_{sp+q})≡(^{t}_{s})*(^{r}_{q})\pmod p(sp+qtp+r)(st)(qr)(modp)

有一个 p=2p=2 时的推论,(^x_y)≡[x \ \text{and} \ y=y]\pmod 2(yx)[x and y=y](mod2)。

离散对数(BSGS)

下次一定。

类欧几里得算法

下次一定。

PART 2

前置知识

  • 线性筛
  • 整除分块

常见函数

  • d(x) = ∑_{a|x} 1d(x)=ax1,即约数个数。
  • σ(x) = ∑_{a|x} aσ(x)=axa,即约数和。
  • id(x)=xid(x)=x。
  • I(x)=1I(x)=1。
  • e(x)=[x=1]e(x)=[x=1]。
  • φ(x)φ(x) 欧拉函数。
  • \mu(x)= \begin{cases} 1&x=1\\ 0&x\text{ 含有平方因子}\\ (-1)^k&k\text{ 为 }x\text{ 的本质不同质因子个数}\\ \end{cases}μ(x)=10(1)kx=1x 含有平方因子k  x 的本质不同质因子个数

积性函数

对于 (a, b) = 1(a,b)=1, f(ab) = f(a)f(b)f(ab)=f(a)f(b),那么 f(x)f(x) 为积性函数。以上常见函数均为积性函数。

积性函数可以线性筛。

莫比乌斯反演

已知 f(n)=\sum_{d|n}g(d)f(n)=dng(d),
那么 g(n)=\sum_{d|n}f(d)μ(\dfrac{n}{d})g(n)=dnf(d)μ(dn)。

狄利克雷卷积(Dirichlet)

两个函数 f,gf,g 的狄利克雷卷积 h=f*gh=fg,满足 h(n)=\sum_{d|n}f(d)g(\frac{n}{d})h(n)=dnf(d)g(dn)。

性质:交换律、结合律、分配律。两个积性函数的卷积还是积性函数。

  • f*e=ffe=f
  • I*\mu =eIμ=e(莫比乌斯函数性质)
  • \mu *id=φμid=φ
  • φ*I=idφI=id
  • I*id=σIid=σ
  • d=I*Id=II

一些套路

(i, j) = ∑_{d|i,d|j}φ(d)(i,j)=di,djφ(d)

\mu^2(x)=\sum_{d^2|x}\mu(d)μ2(x)=d2xμ(d)

d(ij)=\sum_{x|i}\sum_{y|j}[\gcd(x,y)=1]d(ij)=xiyj[gcd(x,y)=1]

一些问题

\sum _{i=1}^nd(i)i=1nd(i)

\sum _{i=1}^nσ(i)i=1nσ(i)

\sum_{i=1}^{n} \sum_{j=1}^{m} (n \bmod i) \times (m \bmod j), i \neq ji=1nj=1m(nmodi)×(mmodj),i=j

\sum_{i=1}^n\sum_{j=1}^m(i,j)i=1nj=1m(i,j)

\sum_{i=1}^n\sum_{j=1}^m[(i,j)=1]i=1nj=1m[(i,j)=1]

\sum_{i=1}^n\sum_{j=1}^m[i+j|ij]i=1nj=1m[i+jij]

杜教筛

现在需要求积性函数 ff 的前缀和。考虑构造一个积性函数 gg,求出 h=f*gh=fg 和 gg 的前缀和。

令 F(n)=\sum_{i=1}^nf(i)F(n)=i=1nf(i)。

\sum_{i=1}^nh(i)i=1nh(i)

=\sum_{i=1}^n\sum_{d|i}g(d)\times f(\frac{i}{d})=i=1ndig(d)×f(di)

=\sum_{d=1}^ng(d)\sum_{i=1}^{\lfloor\frac{n}{d} \rfloor}f(i)=d=1ng(d)i=1dnf(i)

=\sum_{d=1}^ng(d)\times F(\lfloor\dfrac{n}{d} \rfloor)=d=1ng(d)×F(dn)。

考虑到 g(1)F(n)=\sum_{i=1}^nh(i)-\sum_{d=2}^ng(d)F(\lfloor\dfrac{n}{d} \rfloor)g(1)F(n)=i=1nh(i)d=2ng(d)F(dn)。

所以找到 gg 使得可以计算 f*gfg 和 gg 的前缀和即可算出 F(n)F(n)。

ll getSum (int n) { // 算 f 前缀和的函数
  if (n<=MAXN) return x[n];//线性筛范围内
  if (Sumx[n]) return Sumx[n];//记忆化
  ll ans = f_g_sum(n); // 算 f * g 的前缀和
  // 以下这个 for 循环是数论分块
  for (ll l=2,r;l<=n;l=r+1) { // 注意从 2 开始
    r=(n /(n/l)); 
    ans-=(g_sum(r)-g_sum(l - 1))*getSum(n / l);
    // g_sum 是 g 的前缀和
    // 递归 GetSum 求解
  } 
  return Sumx[n]=ans; 
}

该算法的复杂度为 O(n^{\frac{3}{4}})O(n43)。

接下来几个例子:

  • 求 \varphiφ 的前缀和:φ*I=idφI=id。

  • 求 \muμ 的前缀和:\mu*I =eμI=e。

一些问题

\sum _{i=1}^n\varphi(i)\times ii=1nφ(i)×i

Tips:考虑 f=\varphi·idf=φid,g=idg=id,f*g=id^2fg=id2。