原根的性质

原根的指数

如果 ggmm 的原根,那么 <g,g1,g2,,gφ(m)>\displaystyle \left<g, g^1, g^2, \cdots, g^{\varphi(m)} \right> 形成模 mm 的一个简化剩余系
因为 gφ(m)1(mod m)\displaystyle g^{\varphi(m)} \equiv 1(\bmod \ m)实际上
<1,g1,g2,,gφ(m)1>\displaystyle \left<1, g^1, g^2, \cdots, g^{\varphi(m)-1} \right> 形成模 mm 的一个简化剩余系

如果 (a,m)=1(a, m) = 1,那么在区间 0kφ(m)10 \leqslant k \leqslant\varphi(m) - 1 中有唯一的 kk,使得 agk(mod m)\displaystyle a \equiv g^k (\bmod \ m)
kk 称为以 gg 为底,aa 对模 mm 的指数,写为 k=indg(a)\displaystyle k = \text{ind}_g(a),也可以写成 ind(a)\text{ind}(a)

指数运算
gg 是模 mm 的一个原根,并且 (a,m)=(b,m)=1(a, m) = (b, m) = 1,那么有
(1)ind(ab)ind(a)+ind(b)(mod φ(m))\textbf{(1)} \quad \text{ind}(ab) \equiv \text{ind}(a) + \text{ind}(b) (\bmod \ \varphi(m))

我们有 gind(a)a(mod m),gind(b)b(modm)\displaystyle g^{\text{ind}(a)} \equiv a(\bmod \ m), \quad g^{\text{ind}(b)} \equiv b(\bmod m)
由此 αm+a=gind(a), βm+b=gind(b)\displaystyle \alpha m + a = g^{\text{ind}(a)}, \ \beta m + b = g^{\text{ind}(b)}
可以推出 gind(a)+ind(b)=(αm+a)(βm+b)ab(modm)gind(ab)(mod m)g^{\text{ind}(a) + \text{ind}(b)} = (\alpha m + a)(\beta m + b) \equiv ab (\bmod m) \equiv g^{\text{ind}(ab)} (\bmod \ m)
因为 ind(ab)[0,φ(m)1]\text{ind}(ab) \in [0, \varphi(m) - 1],我们可以有 ind(ab)ind(a)+ind(b)(mod φ(m))\text{ind}(ab) \equiv \text{ind}(a) + \text{ind}(b) (\bmod \ \varphi(m))
或者这么看,ind(ab)\text{ind}(ab)ind(a)+ind(b)\text{ind}(a) + \text{ind}(b)φ(m)\varphi(m) 的剩余系中相等即可

(2)ind(an)nind(a) (mod φ(m)), n1\textbf{(2)} \quad \text{ind}(a^n) \equiv n \text{ind}(a) \ (\bmod \ \varphi(m)), \ n \geqslant 1

同样,(gind(a))n=(a+αm)nan(mod m)gind(an)(mod m)\displaystyle \left( g^{\text{ind}(a)} \right)^n = (a + \alpha m)^n \equiv a^{n} (\bmod \ m) \equiv g^{\text{ind}(a^n)} (\bmod \ m)

(3)ind(1)=0, ind(g)=1\textbf{(3)} \quad \text{ind}(1) = 0, \ \text{ind}(g) = 1

gind(g)g(mod m)g^{\text{ind}(g)} \equiv g(\bmod \ m),因为 (g,m)=1(g, m) = 1,所以有 gind(g)11g0(mod m)g^{\text{ind}(g) - 1} \equiv 1 \equiv g^0(\bmod \ m)
在模 mm 的剩余系中,只能 ind(g)1=0\text{ind}(g) - 1 = 0
同样 1ind(1)1(mod m)1^{\text{ind}(1)} \equiv 1(\bmod \ m),所以 ind(1)\text{ind}(1) 只能是 00

(4)ind(1)=φ(m)2, m2\textbf{(4)} \quad \text{ind}(-1) = \displaystyle \frac{\varphi(m)}{2}, \ m \geqslant 2

gφ(m)21(mod m)\displaystyle g^{\frac{ \varphi(m) }{2}} \equiv -1 (\bmod \ m),我们不妨来求一下 gφ(m)/2g^{\varphi(m) / 2},令 t=φ(m)/2t = \varphi(m) / 2
f(g)=(gt)2=gφ(m)1(modm)\displaystyle f(g) = \left(g^{t}\right)^2 = g^{\varphi(m)} \equiv 1(\bmod m)
不妨设 f(g)=αm+1f(g) = \alpha m + 1f(g)f(g)完全平方数,它只能是 (km+1)2(km + 1)^2 或者是 (km1)2(km-1)^2 的形式
gφ(m)/2=km+1g^{\varphi(m) / 2} = km + 1 或者 km1km - 1,如果 gφ(m)/21(mod m)g^{\varphi(m) / 2} \equiv 1(\bmod \ m),与原根定义矛盾
所以只能 gφ(m)/21(mod m)g^{\varphi(m) / 2} \equiv -1(\bmod \ m)

(5)\textbf{(5)} 如果 gg' 也是模 mm 的一个原根,那么 indg(a)indg(a)indg(g) (modφ(m))\text{ind}_g(a) \equiv \text{ind}_{g'}(a) \cdot \text{ind}_g(g') \ (\bmod \varphi(m))

因为 gg' 也是模 mm 的一个原根,所以有 g=g+kmg' = g + km,下面来证明 indg(g)=1\text{ind}_g(g') = 1
gindg(g)g(g+km)g(mod m)g^{\text{ind}_g(g')} \equiv g' \equiv (g + km) \equiv g(\bmod \ m),因为 (g,m)=1(g, m) = 1,所以 indg(g)=1\text{ind}_g(g') = 1

接下来只需要证明 indg(a)indg(a)\text{ind}_g(a) \equiv \text{ind}_{g'}(a),考虑 gindg(a), gindg(a)\displaystyle g^{\text{ind}_g(a)}, \ g^{\text{ind}_g'(a)}
gindg(a)a(mod m), (g)indg(a)a(mod m)\displaystyle g^{\text{ind}_g(a)} \equiv a(\bmod \ m), \ (g')^{\text{ind}_{g'}(a)} \equiv a (\bmod \ m)
二项展开 (g)indg(a)=(g+km)indg(a)gindg(a)(modm)\displaystyle (g')^{\text{ind}_{g'}(a)} = \left(g+km\right)^{\text{ind}_{g'}(a)} \equiv g^{\text{ind}_{g'}(a)}(\bmod m)

a(g)indg(a)gindg(a)gindg(a)(mod m)a \equiv (g')^{\text{ind}_g'(a)} \equiv g^{\text{ind}_g'(a)} \equiv g^{\text{ind}_g(a)} (\bmod \ m),证毕

NTT

根据原根理论,对于素数 pp,如果 <g1,g2,g3,,gp1>\left<g^1, g^2, g^3, \cdots, g^{p-1} \right> 取遍 {1,2,,p1}\{1, 2, \cdots, p-1 \} 的所有整数
那么 gg 就是关于素数 pp 的原根

这样,在 FFT 中,用 gng_n 代替 ωn\omega_n,其中 gn=gp1n\displaystyle g_n = g^{\frac{p-1}{n}}nn22 的幂
那么有如下性质

  • gnn=gp1=gφ(p)=1\displaystyle g_n^n = g^{p-1} = g^{\varphi(p)} = 1
  • gnn/2=gn(p1)/21(mod p)\displaystyle g_n^{n/2} = g_n^{(p-1)/2} \equiv -1 (\bmod \ p)
  • gdndk=gdk(p1)/dn=gk(p1)/n=gnk\displaystyle g_{dn}^{dk} = g^{dk(p-1) / dn} = g^{k(p-1) / n} = g_n^{k}
  • (gnk)2=gn/2k\displaystyle \left(g_n^k \right)^2 = g_{n/2}^k

这样 FFT 中所有 ωn\omega_n 有的性质,gng_n 都有
只不过所有的运算要换成pp 意义下的运算1/n1/n 换成模 pp 意义下的逆元

剩下的问题就是求原根,常见的模数的原根如下
p=1004535809=479221+1,g=3p = 1004535809 = 479 \cdot 2^{21} + 1, \quad g = 3
p=998244353=717223+1,g=3p = 998244353 = 7 \cdot 17 \cdot 2^{23} + 1, \quad g = 3

原根求解算法

假设 gg 是关于模 PP 的原根,首先 <1,g,g2,,gφ(P)1>\displaystyle \left<1, g, g^2, \cdots, g^{\varphi(P) - 1} \right> 必须取遍 PP 的简化剩余系
那么 gg 的取值最坏情况可能是 <2,3,,P1>\displaystyle \left< 2, 3, \cdots, P-1 \right> 这么几种
不难想到可以枚举 gg

如果 gg 不是 PP 的原根,那么一定存在 0i<jφ(P)10 \leqslant i < j \leqslant \varphi(P) - 1,我们有 gigj(mod P)g^i \equiv g^j (\bmod \ P)
也就是说 gij1(mod P)g^{i-j} \equiv 1 (\bmod \ P),不妨令 d=jid = j - i,我们有
gd1(mod P),gφ(P)1(mod P)\displaystyle g^{d} \equiv 1 (\bmod \ P), \quad g^{\varphi(P)} \equiv 1(\bmod \ P),从而有 dφ(P)d \mid \varphi(P)

于是我们可以想到对 φ(P)\varphi(P) 进行素因子分解,假设含有的素因子为 <p1,p2,,pk>\displaystyle \left<p_1, p_2, \cdots , p_k \right>
接下来没有必要检查 φ(P)\varphi(P) 的所有素因子,因为如果我们找到比如说 d=kpid = k \cdot p_i,使得 gd1(mod P)\displaystyle g^{d} \equiv 1 (\bmod \ P)
那么一定有 <gd,g2d,g3d,>1(mod P)\left< g^{d}, g^{2d}, g^{3d}, \cdots \right> \equiv 1(\bmod \ P)

所以 gg 是原根,那么剔除 φ(P)\displaystyle \varphi(P) 的任意素因子,即 d=<φ(P)p1,φ(P)p2,φ(P)pk>\displaystyle d = \left<\frac{\varphi(P)}{p_1}, \frac{\varphi(P)}{p_2}, \cdots \frac{\varphi(P)}{p_k} \right>

都因该满足 gd≢1(mod P)g^{d} \not \equiv 1(\bmod \ P)

实现上,可以先预处理对 φ(P)=P1\varphi(P) = P-1 进行唯一分解,然后枚举 g[2,P1]g \in [2, P-1]
对于每一个素因子 <p1,p2,,pk>\left<p_1, p_2, \cdots, p_k \right>,如果发现 gφ(P)pi1(mod P)\displaystyle g^{\frac{\varphi(P)}{p_i}} \equiv 1(\bmod \ P)
那么标记 gg 不是原根,检查其他的 gg,否则我们就返回 gg

NTT 算法实现

一些题目

题目1

染色
算法设计
nn 个位置需要染色,可以考虑如下分组,先从 mm 种颜色中任选 kk 种,每一种元素是一组,然后剩下的颜色分一组
对于 [1k][1\cdots k] 组,每一组放 ss 个元素,表示 kk 种颜色,每一种都染了 ss 个位置
那么剩下的呢?剩下 (nks)(n - ks) 个位置呢?怎么染色?
实际上,剩下的位置可以染剩下的 (mk)(m - k) 种颜色中的任意一种,这样我们可以得到一个初步的表达式

(mk)(mk)nksn!(s!)k(nks)!\displaystyle \binom{m}{k} \cdot (m-k)^{n-ks} \cdot \frac{n!}{(s!)^{k} \cdot (n - ks)!}

其中 n!(s!)k(nks)!\displaystyle \frac{n!}{(s!)^k \cdot (n - ks)!} 表示分组排列的方案数

但是,这并不是我们需要的,题目中要求 kk 种颜色恰好出现了 ss
上面的表达式可以保证一定有 kk 种颜色出现了 ss 次,但是对于剩下的 (mk)(m - k) 种颜色呢?
对于未染色的 (nks)(n - ks) 个位置,我们是从剩下的 (mk)(m - k) 种颜色中任意选取,所以
还可能存在 kk 种颜色之外的其他颜色,也染了 ss 个位置
上面的表达式计算,求出的出现 ss 次的颜色种类 k\geqslant k 种,不妨记为 f(k)f(k)

f(k)=(mk)(mk)nksn!(s!)k(nks)!\displaystyle f(k) = \binom{m}{k} \cdot (m-k)^{n-ks} \cdot \frac{n!}{(s!)^{k} \cdot (n - ks)!}

f(k)f(k) 表示出现 ss 次的颜色至少kk 种的方案数

我们需要的是出现 ss 次的颜色恰好kk 种的方案,不妨记为 g(k)g(k),那么出现 ss 次的颜色最多有多少种呢?
不难想到最多有 N=min(m,ns)\displaystyle N = \min \left(m, \left\lfloor \frac{n}{s} \right\rfloor \right)

f(k)=i=kNg(i)\displaystyle f(k) = \sum_{i = k}^{N} g(i),只可惜这样还是不对

已知出现 ss 次的颜色恰好有 ii 种,对应的方案数为 g(i)g(i),但 f(k)f(k) 对应的是
kk 种颜色一定要出现 ss 次,剩下的没有限制,仅仅把 g(i)g(i) 加起来会漏解

实际上,对于恰好ii 种颜色出现 ss 次,方案数为 g(i)g(i),那么推 f(k)f(k) 时应该这样考虑
ii 种颜色中 (ik)\displaystyle \binom{i}{k} 任意选择 kk 种颜色一定出现 ss 次,剩下 (ik)(i-k) 种颜色出现次数没有限制

f(k)=i=kNg(i)(ik)\displaystyle f(k) = \sum_{i = k}^{N} g(i) \cdot \binom{i}{k}

接下来考虑如何计算,我们需要知道的是 g(k)g(k),最后的答案是 k=0N(g(k)wk)\displaystyle \sum_{k = 0}^{N} (g(k) \cdot w_k)

f(k)=i=kN(ik)g(i)\displaystyle f(k) = \sum_{i = k}^{N} \binom{i}{k} \cdot g(i)二项式反演可以得到

g(k)=i=kN(1)ik(ik)f(i)\displaystyle g(k) = \sum_{i = k}^{N} (-1)^{i - k} \binom{i}{k} \cdot f(i)

化简可得
k!g(k)=i=kN((1)ik(ik)!)(i!f(i))\displaystyle k! g(k) = \sum_{i = k}^{N} \left(\frac{(-1)^{i - k}}{(i-k)!} \right) \left(i! f(i) \right)

A(i)=i!f(i)A(i) = i! f(i)B(i)=(1)ii!B(i) = \displaystyle \frac{(-1)^i}{i!}

那么 g(k)=1k!i=kNA(i)B(ik)\displaystyle g(k) = \frac{1}{k!} \sum_{i = k}^{N} A(i)B(i-k)

下面考虑化简该式
g(k)=1k!kiNA(i)B(ik)g(k) = \displaystyle \frac{1}{k!} \sum_{k \leqslant i \leqslant N} A(i)B(i-k) 并不是标准的卷积形式

做变量替换,令 i=iki' = i - k,那么变量范围为 0iNk0 \leqslant i' \leqslant N-k

g(k)=1k!0iNkA(i+k)B(i)\displaystyle g(k) = \frac{1}{k!} \sum_{0 \leqslant i \leqslant N-k} A(i+k)B(i),但可惜这也不是标准卷积形式

A(i+k)=A(Nki)A(i+k) = A'(N-k-i),这样 g(k)=1k!0iNkA(Nki)B(i)\displaystyle g(k) = \frac{1}{k!} \sum_{0 \leqslant i \leqslant N-k} A'(N-k-i)B(i)

这就是标准的卷积形式,只要做变换 A(x)=A(Nx)A'(x) = A(N-x),这样就可以得到

g(k)=1k!0iNkA(Nki)B(i)\displaystyle g(k) = \frac{1}{k!} \sum_{0 \leqslant i \leqslant N-k} A'(N-k-i)B(i),用 NTT\text{NTT} 求卷积

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int N, n, m, s;
int w[maxm];

void solve() {
N = min(m, n/s);
vector<mint> f(N+1, 0);
for (int i = 0; i <= N; i++) f[i] = binom(m, i) * power(mint(m-i), n-s*i) * fac[n] * power(infac[s], i) * (infac[n-s*i]);
vector<mint> _a(N+1, 0), _b(N+1, 0);
for (int i = 0; i <= N; i++) _a[i] = fac[i] * f[i];
for (int i = 0; i <= N; i++) _b[i] = ( (i & 1) ? (-1) : 1 ) * infac[i];
for (int i = 0; i <= N; i++) if (i < N - i) swap(_a[i], _a[N-i]);

Poly A(_a), B(_b);
Poly C = A * B;

mint ans = 0;
for (int k = 0; k <= N; k++) ans = ans + mint(w[k]) * infac[k] * C[N-k];
printf("%d\n", ans.x);
}

二项式反演的推导(1)

fn=i=0n(ni)gign=i=0n(1)ni(ni)fi\displaystyle f_n = \sum_{i = 0}^n \binom{n}{i} g_i \Leftrightarrow g_n = \sum_{i = 0}^{n} (-1)^{n-i} \binom{n}{i} f_i
这个可以用生成函数来推

fnn!=i=0ngii!1(ni)!\displaystyle \frac{f_n}{n!} = \sum_{i = 0}^{n} \frac{g_i}{i!} \frac{1}{(n - i)!},可以知道

F={fnn!}\displaystyle F = \left\{\frac{f_n}{n!}\right\}EGF\text{EGF}Fi=i=0fixi\displaystyle F_i = \sum_{i = 0}^{\infty} f_ix^i

G={gnn!}\displaystyle G = \left\{\frac{g_n}{n!} \right\}EGF\text{EGF}Gi=i=0gixi\displaystyle G_i = \sum_{i = 0}^{\infty} g_ix^i

根据 ex=i=0xii!,ex=i=0(1)ixii!\displaystyle e^x = \sum_{i = 0}^{\infty} \frac{x^i}{i!}, \quad e^{-x} = \sum_{i = 0}^{\infty} (-1)^i \frac{x^i}{i!}

我们有 F=GexF = G \cdot e^{x},由此 G=FexG = F \cdot e^{-x},根据生成函数的系数展开

gnn!=i=0nfii!(1)ni1(ni)!\displaystyle \frac{g_n}{n!} = \sum_{i = 0}^{n} \frac{f_i}{i!} \cdot (-1)^{n-i} \frac{1}{(n-i)!},证毕

二项式反演的推导(2)

fn=i=0n(1)i(ni)gign=i=0n(1)i(ni)fi\displaystyle f_n = \sum_{i = 0}^{n} (-1)^i \binom{n}{i}g_i \Longleftrightarrow g_n = \sum_{i = 0}^{n} (-1)^i\binom{n}{i}f_i

这里使用待定系数的方法来构造

gn=i=0nt(n,i)fi,t(n,i)\displaystyle g_n = \sum_{i = 0}^{n} t(n, i)\cdot f_i, \quad t(n, i) 为待定系数

fn=i=0n(1)i(ni)j=0it(i,j)fj=j=0nfji=jn(1)i(ni)t(i,j)\displaystyle f_n = \sum_{i = 0}^{n} (-1)^i \binom{n}{i} \sum_{j = 0}^{i} t(i, j)\cdot f_j = \sum_{j = 0}^{n} f_j \sum_{i = j}^{n} (-1)^i \binom{n}{i}t(i, j)

i=ij,i=i+ji' = i - j, \quad i = i'+j 代换

fn=j=0nfji=0nj(1)i+j(ni+j)t(i+j,j)\displaystyle f_n = \sum_{j = 0}^{n} f_j \sum_{i = 0}^{n - j} (-1)^{i+j} \binom{n}{i+j} t(i+j, j)

注意到 j=nj = n 的时候,fn=fnf_n = f_n,于是我们必须构造出

[j=n]=i=0nj(1)i+j(ni+j)t(i+j,j)(1)\displaystyle [j = n] = \sum_{i = 0}^{n - j} (-1)^{i+j} \binom{n}{i+j} t(i+j, j) \quad \textbf{(1)}

注意到 (11)n(1-1)^n 的展开,有 [n=0]=i=0n(1)i(ni)\displaystyle [n = 0] = \sum_{i = 0}^{n}(-1)^i \binom{n}{i}

[j=n]=i=0nj(1)i(nji)(2)\displaystyle [j = n] = \sum_{i = 0}^{n - j} (-1)^i \binom{n - j}{i} \quad \textbf{(2)}

(1), (2)\textbf{(1), (2)} 对比,可以知道 t(i+j,j)t(i+j, j) 中有组合数形式,我们配凑

[j=n]=i=0nj(1)i(nji)(nj)=i=0nj(1)i(nnj)(nji)\displaystyle [j = n] = \sum_{i = 0}^{n - j} (-1)^i \binom{n-j}{i} \binom{n}{j} = \sum_{i = 0}^{n - j} (-1)^i \binom{n}{n - j} \binom{n-j}{i}

=i=0nj(1)i(ni)(ninji)=i=0nj(1)i(ni)(nij)\displaystyle \quad \quad = \sum_{i = 0}^{n - j} (-1)^i \binom{n}{i} \binom{n-i}{n-j-i} = \sum_{i = 0}^{n - j} (-1)^i \binom{n}{i} \binom{n-i}{j}

其中,我们根据恒等式 (ni+j)(i+ji)=(ni)(nij)\displaystyle \binom{n}{i+j} \binom{i+j}{i} = \binom{n}{i} \binom{n-i}{j}

所以有 [j=n]=i=0nj(1)i(ni+j)(i+ji)\displaystyle [j = n] = \sum_{i = 0}^{n-j} (-1)^i \binom{n}{i+j} \binom{i+j}{i},从而有

t(i+j,j)=(1)j(i+ji)=(1)j(i+jj)\displaystyle t(i+j, j) = (-1)^j \cdot \binom{i+j}{i} = (-1)^j \binom{i+j}{j},从而有

t(i,j)=(1)j(ij)\displaystyle t(i, j) = (-1)^j \binom{i}{j}

题目2

城市规划