中国剩余定理
对于下面的方程组(其中 n1,n2,⋯,nm 两两互质):
⎧⎪
⎪
⎪⎨⎪
⎪
⎪⎩x≡a1(modn1)x≡a2(modn2)⋯x≡am(modnm)
其在模 A 意义下的解为 ∑mi=1aitiAni,其中 A=∏mi=1ni,ti 为模 ni 意义下 Ani 的逆元。由于 n1,n2,⋯,nm 互质可得其为唯一解。
证明
考虑 ∑mi=1aitiAni 模 nk 时,只需要考虑 aktkAnk 一项(其他项的 Ani 均有 nk 这个因数),此时有 aktkAnk≡ak(modnk)。
应用
在计算某个数对非质数 M 取模的结果时,可以将 M 表示成若干互质的数积的形式(某些时候可以用质数表示),分别计算答案在模这些数的意义下的值,然后使用中国剩余定理合并即可。
同时在计算任意模数多项式乘法时,可以考虑将所有系数不取模表示然后模给定模数;而此时可以使用三个足够大的 NTT 模数 P1,P2,P3(e.g. 可以令它们分别为 469762049,998244353,1004535809,它们的原根均为 3),满足 P1P2P3 大于不取模的系数最大值,然后分别在模 P1,P2,P3 意义下求值再使用中国剩余定理合并。
使用中国剩余定理的原理可以推导出 拉格朗日插值法。
扩展中国剩余定理
考虑上述 n1,n2,⋯,nm 不满足两两互质的情况。此时对于 x≡a1(modn1),x≡a2(modn2),可以将 x 表示成 k1n1+a1 或 k2n2+a2 的形式。由于 k1n1+a1=k2n2+a2,所以有 k1n1−k2n2=a2−a1,在 gcd(n1,n2)/|a2−a1 时无解,否则可以用 exgcd 解出某组 k1,k2,则前两个方程等效于 x≡k1n1+a1(modlcm(n1,n2))。
代码
点此查看代码
| #include <bits/stdc++.h> |
| using namespace std; |
| #define lll __int128_t |
| int i,k; lll sol,m=1,t1,t2,g; |
| long long a[100010],b[100010]; |
| lll exgcd(lll A,lll B,lll &X,lll &Y){ |
| if(!B){X=1;Y=0;return A;} |
| lll ret=exgcd(B,A%B,X,Y); |
| lll T=X;X=Y;Y=T-(A/B)*Y; |
| return ret; |
| } |
| void Write(lll A){ |
| if(A>9) Write(A/10); |
| putchar((A%10)+'0'); |
| } |
| int main(){ |
| scanf("%d",&k); |
| for(i=1;i<=k;++i) scanf("%lld%lld",&a[i],&b[i]); |
| for(i=1;i<=k;++i){ |
| g=exgcd(m,a[i],t1,t2); |
| t1*=b[i]-sol;t1/=g; |
| sol+=t1*m; m*=a[i]/g; |
| sol=(sol%m+m)%m; |
| } |
| Write((sol%m+m)%m); return 0; |
| } |
Lucas 定理
对于质数 p,有:
(nm)modp=⎛⎜⎝(⌊np⌋⌊mp⌋)(nmodpmmodp)⎞⎟⎠modp
证明
考虑 (a+b)p≡∑pi=0(pi)aibp−i≡ap+bp(modp)。所以有如下化简 (nm) 的方式:
(nm)≡[xm](1+x)n≡[xm](1+x)p⌊np⌋(1+x)nmodp≡[xm](1+xp)⌊np⌋(1+x)nmodp≡([xp⌊mp⌋](1+xp)⌊np⌋)([xmmodp](1+x)nmodp)≡(⌊np⌋⌊mp⌋)(nmodpmmodp)(modp)
上面式子的第三行中 (1+xp)⌊np⌋ 只会在 xpi,i∈N 处有取值,而 (1+x)nmodp 不可能在 ∀i≥p,xp 处有非 1 的取值;所以两者之积的 xn 项可以拆到两个因式内分别计算。
Wilson 定理
对于质数 p,有:
(p−1)!≡−1(modp)
证明
考虑 1∼p−1 内每个数在模 p 意义下均有一个唯一的逆元,其中 p−1 的逆元显然为 p−1,所以 1∼p−2 内每个数在模 p 意义下逆元在 1∼p−2 内,有 (p−1)!≡(p−2)!(p−1)≡−1(modp)。
原根
对于某个数 P,如果存在某个 1∼P−1 的数 g,满足 |⋃P−2i=0{gimodP}|=P−1(gi 在模 P 意义下两两不同),则称 g 为模 P 的原根。此时每个小于 P 的正整数都可以表示成某个 gi 的形式。
判定:对于某个大于 3 的数 M,g 为模 M 的原根当且仅当对于 φ(M) 的每个质因数 p 都有 gφ(m)p≠≡1(modM)。M 只有在为 2,4,pe,2pe(其中 p 为奇质数,e∈N+)时才存在原根,此时 M 的最小原根在 O(M14) 级别。(证明可以看 OI Wiki)
BSGS
在解方程 ax≡b(modp)(a,p 互质)时,可以将 x 拆成 k1√p−k2 的形式,此时 ak1√p≡bak2(modp)。对于每个 k1 预处理出所有的 ak1√p,再对每个 bak2 检查有无 ak1√p 对应即可。同理解方程 xa≡b(modp)(p 为质数)时可以将 x 化成 gc 然后将整个方程化为 (ga)c≡b(modp) 的形式。
常用积性函数
单位函数:ε(n)=[n=1]。
恒等函数:idk(n)=nk,id1(n) 可简记为 id(n)。
常数函数:1(n)=n。
除数函数:σk(n)=∑d|ndk。此时 σ0(n) 为 n 的因子个数,可以简记为 d(n) 或 τ(n);σ1(n) 为 n 的因子和,可以简记为 σ(n)。
欧拉函数:φ(n)=∑ni=1[gcd(i,n)=1]。
莫比乌斯函数:μ(n)=⎧⎪⎨⎪⎩1n=10∃d>1,d2|n(−1)ω(n)otherwise,其中 ω(n) 为 n 的不同质因子个数,是一个加性函数(∀x,y,gcd(x,y)=1→ω(x)+ω(y)=ω(xy))。
狄利克雷卷积
定义
对于两个数论函数(定义域为正整数的函数)f,g,定义它们的狄利克雷卷积 h=f∗g 为 h(n)=∑i|nf(i)g(ni)。
性质
狄利克雷卷积满足交换律,结合律,加法分配律,存在唯一的单位元 ε,且每个元素存在唯一的逆元等性质。
两个积性函数的狄利克雷卷积也是积性函数
对于积性函数 f,g 和一对满足 gcd(a,b)=1 的 a,b,h=f∗g 满足 h(a)=∑i|af(i)g(ai),h(b)=∑j|bf(j)g(bj),则有:
h(a)h(b)=⎛⎝∑i|af(i)g(ai)⎞⎠⎛⎝∑j|bf(j)g(bj)⎞⎠=∑k|abf(k)g(abk)=h(ab)
积性函数的逆元也是积性函数
令 g 为积性函数 f 的逆元,有 g(1)=1f(1)=1。考虑归纳法,探讨 ∀n,m,gcd(n,m)=1 在满足 ∀s<nm 时满足 ∀x|s,gcd(x,sx)=1,g(x)g(sx)=g(s) 时 g(nm) 的性质。由 ∑i|nmf(i)g(nmi)=0 得:
g(nm)=f(1)g(nm1)=−∑ab|nm,ab>1f(ab)g(nmab)=−∑a|n,b|m,ab>1f(a)f(b)g(na)g(mb)=f(1)f(1)g(n)g(m)−∑a|n,b|mf(a)g(na)f(b)g(mb)=g(n)g(m)−⎛⎝∑a|nf(a)g(na)⎞⎠⎛⎝∑b|mf(b)g(mb)⎞⎠=g(n)g(m)
莫比乌斯反演
在求某个函数 f 时,如果求其本身不简单而求其约数和/倍数和 g 比较简单,则可以通过莫比乌斯反演简化计算。(之前并没有比较系统地学习过)
μ 的性质
∑d|nμ(d)=[n=1]/μ∗1=ε
证明:考虑将 n 分解质因数为 ∏mi=1pcii(其中每个 ci>0)的形式,此时将 n 化为 ∏mi=1pi 结果不变。此时 ∑d|nμ(d) 等效于在 p1∼pm 中取若干个,相当于 ∑mi=1(mi)(−1)i=(1−1)m=[m=0]=[n=1]。此时如果某个 f(i)=∑d|ig(d),则 g(i)=∑d|if(d)μ(id)。
推论:∑d|ndμ(nd)=φ(n)/μ∗id=φ
证明:考虑 μ∗id=φ 就是 id=φ∗1。令 n=∏mi=1pcii,有如下证明方法:
(φ∗1)(n)=∑d|nφ(d)=∑∀i∈[1,m],bi≤ciφ(m∏i=1pbii)=∑∀i∈[1,m],bi≤cim∏i=1φ(pbii)=m∏i=1ci∑j=0φ(pji)=m∏i=1(1+(p−1)ci−1∑j=0pj)=m∏i=1pcii=n
杜教筛
对于数论函数 f,在求 ∑ni=1f(i) 时,考虑写出 f 的前缀和 F 的递推式。此时可以引入某个数论函数 g,则有:
n∑i=1(f∗g)(i)=n∑i=1∑j|ig(j)f(ij)=n∑j=1g(j)⌊nj⌋∑i=1f(i)=n∑j=1g(j)F(⌊nj⌋)
此时 F(n)=1g(0)(∑ni=1(f∗g)(i)−∑nj=2g(j)F(⌊nj⌋)),后面一项可以使用整除分块结合已经求出的 F 值求出。g 的要求则是 g,f∗g 能快速求前缀和。
Powerful Number 筛
过程
对于积性函数 f,在求 ∑ni=1f(i) 时,可以构造出另外一个积性函数 g,满足其易求前缀和且对于质数 p 有 g(p)=f(p)。然后再构造一个函数 h 满足 f=g∗h。此时对于某个质数 p,有 f(p)=g(1)h(p)+g(p)h(1)=h(p)+f(p)h(1),由 h 是积性函数可得 h(p)=0。所以对于某个 x,h(x)≠0 当且仅当 x=1 或 x 的每个质因子都出现了超过一遍,我们称后者为 Powerful Number,简称 PN。
Powerful Number 的性质
1. 所有 PN 都可以表示成 a2b3 (ab≠1) 的形式,或者是对于每对满足 ab≠1 的 a,b 一定有 a2b3 能取遍所有 PN(可能重复)
显然对于某个大于 1 的数 x,一定能被表示成 2a+3b 的形式(a,b≥0)。
2. n 以内的 PN 的数量为 O(√n) 级别
考虑枚举 a 计算 b 的数量,则可得 PN 的数量级别不超过:
√n∑i=1⌊3√ni2⌋=O(∫√n13√nx2dx)=O(∫√n1n13x−23dx)=O(33√n√n−33√n)=O(√n)
所以令 G(i)=∑ij=1g(j),则计算 ∑ni=1f(i) 方法如下:
n∑i=1f(i)=n∑i=1∑j|ih(j)g(ij)=n∑j=1⌊nj⌋∑i=1h(j)g(i)=n∑j=1h(j)⌊nj⌋∑i=1g(i)=n∑j=1h(j)G(⌊nj⌋)
所以只需要在 dfs 出每个 PN 时求出 h(j)G(⌊nj⌋) 即可,dfs 时可以先处理好每个 pc 的对应 h 值,利用积性函数的性质计算每一项的和。
参考资料:OI Wiki。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?