小学数学知识

中国剩余定理

对于下面的方程组(其中 n1,n2,,nm 两两互质):

{xa1(modn1)xa2(modn2)xam(modnm)

其在模 A 意义下的解为 i=1maitiAni,其中 A=i=1mni,ti 为模 ni 意义下 Ani 的逆元。由于 n1,n2,,nm 互质可得其为唯一解。

证明

考虑 i=1maitiAnink 时,只需要考虑 aktkAnk 一项(其他项的 Ani 均有 nk 这个因数),此时有 aktkAnkak(modnk)

应用

在计算某个数对非质数 M 取模的结果时,可以将 M 表示成若干互质的数积的形式(某些时候可以用质数表示),分别计算答案在模这些数的意义下的值,然后使用中国剩余定理合并即可。

同时在计算任意模数多项式乘法时,可以考虑将所有系数不取模表示然后模给定模数;而此时可以使用三个足够大的 NTT 模数 P1,P2,P3(e.g. 可以令它们分别为 469762049,998244353,1004535809,它们的原根均为 3),满足 P1P2P3 大于不取模的系数最大值,然后分别在模 P1,P2,P3 意义下求值再使用中国剩余定理合并。

使用中国剩余定理的原理可以推导出 拉格朗日插值法

扩展中国剩余定理

考虑上述 n1,n2,,nm 不满足两两互质的情况。此时对于 xa1(modn1),xa2(modn2),可以将 x 表示成 k1n1+a1k2n2+a2 的形式。由于 k1n1+a1=k2n2+a2,所以有 k1n1k2n2=a2a1,在 gcd(n1,n2)|a2a1 时无解,否则可以用 exgcd 解出某组 k1,k2,则前两个方程等效于 xk1n1+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=((npmp)(nmodpmmodp))modp

证明

考虑 (a+b)pi=0p(pi)aibpiap+bp(modp)。所以有如下化简 (nm) 的方式:

(nm)[xm](1+x)n[xm](1+x)pnp(1+x)nmodp[xm](1+xp)np(1+x)nmodp([xpmp](1+xp)np)([xmmodp](1+x)nmodp)(npmp)(nmodpmmodp)(modp)

上面式子的第三行中 (1+xp)np 只会在 xpi,iN 处有取值,而 (1+x)nmodp 不可能在 ip,xp 处有非 1 的取值;所以两者之积的 xn 项可以拆到两个因式内分别计算。

Wilson 定理

对于质数 p,有:

(p1)!1(modp)

证明

考虑 1p1 内每个数在模 p 意义下均有一个唯一的逆元,其中 p1 的逆元显然为 p1,所以 1p2 内每个数在模 p 意义下逆元在 1p2 内,有 (p1)!(p2)!(p1)1(modp)

原根

对于某个数 P,如果存在某个 1P1 的数 g,满足 |i=0P2{gimodP}|=P1gi 在模 P 意义下两两不同),则称 g 为模 P 的原根。此时每个小于 P 的正整数都可以表示成某个 gi 的形式。

判定:对于某个大于 3 的数 Mg 为模 M 的原根当且仅当对于 φ(M) 的每个质因数 p 都有 gφ(m)p≠≡1(modM)M 只有在为 2,4,pe,2pe(其中 p 为奇质数,eN+)时才存在原根,此时 M 的最小原根在 O(M14) 级别。(证明可以看 OI Wiki)

BSGS

在解方程 axb(modp)a,p 互质)时,可以将 x 拆成 k1pk2 的形式,此时 ak1pbak2(modp)。对于每个 k1 预处理出所有的 ak1p,再对每个 bak2 检查有无 ak1p 对应即可。同理解方程 xab(modp)p 为质数)时可以将 x 化成 gc 然后将整个方程化为 (ga)cb(modp) 的形式。

常用积性函数

单位函数:ε(n)=[n=1]
恒等函数:idk(n)=nkid1(n) 可简记为 id(n)
常数函数:1(n)=n
除数函数:σk(n)=d|ndk。此时 σ0(n)n 的因子个数,可以简记为 d(n)τ(n)σ1(n)n 的因子和,可以简记为 σ(n)
欧拉函数:φ(n)=i=1n[gcd(i,n)=1]
莫比乌斯函数:μ(n)={1n=10d>1,d2|n(1)ω(n)otherwise,其中 ω(n)n 的不同质因子个数,是一个加性函数(x,y,gcd(x,y)=1ω(x)+ω(y)=ω(xy))。

狄利克雷卷积

定义

对于两个数论函数(定义域为正整数的函数)f,g,定义它们的狄利克雷卷积 h=fgh(n)=i|nf(i)g(ni)

性质

狄利克雷卷积满足交换律,结合律,加法分配律,存在唯一的单位元 ε,且每个元素存在唯一的逆元等性质。

两个积性函数的狄利克雷卷积也是积性函数

对于积性函数 f,g 和一对满足 gcd(a,b)=1a,bh=fg 满足 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 分解质因数为 i=1mpici(其中每个 ci>0)的形式,此时将 n 化为 i=1mpi 结果不变。此时 d|nμ(d) 等效于在 p1pm 中取若干个,相当于 i=1m(mi)(1)i=(11)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=i=1mpici,有如下证明方法:

(φ1)(n)=d|nφ(d)=i[1,m],biciφ(i=1mpibi)=i[1,m],bicii=1mφ(pibi)=i=1mj=0ciφ(pij)=i=1m(1+(p1)j=0ci1pj)=i=1mpici=n

杜教筛

对于数论函数 f,在求 i=1nf(i) 时,考虑写出 f 的前缀和 F 的递推式。此时可以引入某个数论函数 g,则有:

i=1n(fg)(i)=i=1nj|ig(j)f(ij)=j=1ng(j)i=1njf(i)=j=1ng(j)F(nj)

此时 F(n)=1g(0)(i=1n(fg)(i)j=2ng(j)F(nj)),后面一项可以使用整除分块结合已经求出的 F 值求出。g 的要求则是 g,fg 能快速求前缀和。

Powerful Number 筛

过程

对于积性函数 f,在求 i=1nf(i) 时,可以构造出另外一个积性函数 g,满足其易求前缀和且对于质数 pg(p)=f(p)。然后再构造一个函数 h 满足 f=gh。此时对于某个质数 p,有 f(p)=g(1)h(p)+g(p)h(1)=h(p)+f(p)h(1),由 h 是积性函数可得 h(p)=0。所以对于某个 xh(x)0 当且仅当 x=1x 的每个质因子都出现了超过一遍,我们称后者为 Powerful Number,简称 PN。


Powerful Number 的性质

1. 所有 PN 都可以表示成 a2b3 (ab1) 的形式,或者是对于每对满足 ab1a,b 一定有 a2b3 能取遍所有 PN(可能重复)

显然对于某个大于 1 的数 x,一定能被表示成 2a+3b 的形式(a,b0)。

2. n 以内的 PN 的数量为 O(n) 级别

考虑枚举 a 计算 b 的数量,则可得 PN 的数量级别不超过:

i=1nni23=O(1nnx23dx)=O(1nn13x23dx)=O(3nn33n3)=O(n)


所以令 G(i)=j=1ig(j),则计算 i=1nf(i) 方法如下:

i=1nf(i)=i=1nj|ih(j)g(ij)=j=1ni=1njh(j)g(i)=j=1nh(j)i=1njg(i)=j=1nh(j)G(nj)

所以只需要在 dfs 出每个 PN 时求出 h(j)G(nj) 即可,dfs 时可以先处理好每个 pc 的对应 h 值,利用积性函数的性质计算每一项的和。


参考资料:OI Wiki

posted @   Fran-Cen  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示