myh爷爷讲课!
excrt
线性同余方程组
满足
ax+b≡c(modd)
可以变成
x≡a(modp)
先变成
ax≡b(modd)
然后我们exgcd解出这个方程,假设最小正整数解为x',y'
x=x0+k∗(d,a)d
y=y0+k∗(d,a)a
如果ni两两互质
然后我们就能发现所有在∏ni范围内的解就是唯一的
就有中国剩余定理
ei=(∏j!=inj)(mod∏ini)
x0=i=1∑naieiinv(ei,ni)(modi∏ni)
因为当modni的时候,这个后面两项的乘积一定是1
然后我们得到的值就是ai
其他项,他们的逆元*ei因为互质一定是ni的倍数,所以就是0
所有的解的形式就是
x=x0+∏i=1ni∗k
不互质的时候可能会无解
excrt,数学归纳法
假设有x1,x2,他们满足这个方程组但是不同
首先我们此对于每个ni模意义下都相同,但是对于∏pi不一定模意义相同
但是我们会发现modLCM(p1....pn)意义下一定不同
那么我们就可以去考虑怎么合并方程
{x≡a1(modn1)x≡a2(modn2)
{x=a1+y1∗n1x=a2+y2∗n2
然后我们考虑怎么搞搞
n1′y1=n2′y2+(a2′−a1′)
modn2′,然后除过去n1′
y1=(a2′−a1)∗inv(n1′,n2′)modn2′
屠龙勇士
大家都挺惨的
ϕn=(pi−1)∏eipiei−1
这个ϕn代表的所有数构成了一个最大的乘法群
比如ϕ12代表了1,5,7,11
他们的乘法运算结果mod12都是自己
且均存在逆元,而且也都是自己
然后我们考虑原根
首先他要和模数互质,保证每次次方一定能得到一个不同的数
原根就是他的0次方到ϕn−1次方都是互不相同的
也就是构成了ϕn集合
其余互质的数,他们的次方也是一个完美的环,但是不一定大小为ϕn
然后我们会发现只有2,4,pk,2pk有原根
我们显然有ϕϕn个原根,可以自己算一下
然后判定也不需要暴力,我们只需要找没有更小的循环节
这个好像只需要判断ϕn的因子是不是1就好了!
但是还是挺慢的
我们考虑所有因数,如果某一个是因子,那么他的约数随便划分一下,两个约数就一定都是1
就是ax=1,axy=1(modn)
xϕn/pk≡1(modn)
直接判断即可qwq
然后我们构造最大循环群就很简单了
找到g,直接枚举一个x,所有gx就是循环群
ex=y
有
x=lny
怎么求x?
用这个方法乘法可以变成加法,然后求逆等价于乘-1,在mod(ϕn)
证明这个ϕϕn个原根?
首先有一个g,然后我们x=gf(x)
fg=1
0f(x),1f(x)....(ϕn−1)f(x)互不相同?
所以gcd(f(x),ϕn)=1
phi的定义就整完了
整数mod n乘法群
mod 12
可以把mod 12中任意一个数变成mod4/mod3
因为12=4*3
考虑5∗7是什么
然后我们有对应的坐标(0,1),(1,0)(mod3/mod4)
所以他们的乘法结果就是(1,1)
phi3=2,phi4=2
7∗11=(1,0)+(1,1)=(0,1)
所以7∗11mod12=5
在mod 2^k意义下,5的阶是2k−2
阶就是不断次方到第一个同余1的时候
然后我们会发现,对于mod 15,5的所有阶得到的结果,乘上-1这8个数就是ϕ16所有数
mod 2意义下和mod2k−2意义下
1=(0,0)
5=(1,0)
9=(2,0)
13=(3,0)
−1=(0,1)
-5=(1,1)
阶
gcd(a,n)=1可以认为是一般有限群的拉格朗日定理推论
aϕ(n)=1
xk=≡1(modn)
然后最小的正整数k就是这个x的阶
怎么求阶呢?
和原根类似,就是直接考虑当前的阶设成ϕn
然后每次除掉一个质因子,看看是不是1,如果是则说明可以变得更下,继续做就好了qwq
考虑变成
{nn≡a(modP)≡b(modP−1)
然后我们要有g吧?
然后n≡ga
(a,b)
(d,c)
根据乘法群我们有
然后我们就有ad≡cb(modP−1)
ad≡cb(modpk)
这个是整数mod n乘法群啊
所以abc都可以任意取,然后我们考虑d就是对应的逆元
答案就是(ϕpk)3
注意我们可能有更复杂的情况,如果abcd有
然后又是一道题
我们考虑怎么计算gcd
gcd(x,ϕpk)=gcd(x,p−1∗(pk−1))=gcd(x,p−1)∗gcd(x,pk−1)
离散对数实质?
gcd(f(x),ϕn)∗ord(x)=ϕn
这道题就需要满足ord(x)∣ord(y),观察一下就会有
m=pa
而我们每次要求ϕm的质因数,所以要pollordrho分解
卢卡斯定理
(617)mod5
≡(13)(12)≡1(mod5)
就是p进制下每一位的组合数乘起来
库默尔定理
VP(n)为n中素因子p出现次数
然后我们有???
不知道不重要
P不是质数,我们可以考虑把p分解,然后解决每个即可
首先我们需要excrt最后每个的结果
然后n!写成pe1q1,m!=pe1q2,(n−m)!=pe3q3
显然三个e都是O(n)级别的
我们是可以对于q取模的啊,就是对于pk取膜
所以就是pe1−e2−e3∗(q1∗(inv(q2,pk)∗inv(q3,pk)))modpk
怎么把n!写成这个形式呢?
预处理
(d≡∏i=0pk−1i(gcd(i,p)=1))modpk
有n=17,pk=4,17!=
1∗3∗5∗7∗9∗11∗17∗28∗(1∗2∗3∗4∗5∗6∗7∗9)
你会发现前面是d,就是d^4,然后乘上17,乘上28提出来,再递归右边部分
然后我们会发现这样只会进行logpn轮qwq
二次剩余
素数p,然后整数x,看看是不是有a2≡x
定义勒让德符号就是如果是二次剩余就是1,否则就是-1,如果p|a的话,就是0,也就是a可以大于p
然后有欧拉准则
ap≡a2p−1(modp)
只有那个非二次剩余难证明
我们考虑所有ij=a,这样的对数,i!=j,同时又有p-1/2对所以这恰好就是(p−1)!≡−1(modp)
最后我们扩域之后得到的结果的bw中b一定是0
x−x0∣x2−a
好像就是说有两个根,然后一定有一个是实数域的,然后另一个是复数域的
BSGS
这个可能平常是离散对数
实际上是求解ak=b
a,b是代数结构里面的东西,ab是一个半群,就是能够做一个结合律就好了
M=⌈∣S∣⌉
然后预处理前am,和a0,am,a2m...
我们将后面的都插入哈希表
如果一个数出现了两次相同可能完蛋,就是我们两次都早的另一个点上去
,枚举一个q,小于m,查询b∗aq
如果找到的话acM,就有b∗aq≡acM
b有可能是acM−q,有逆元一定是
因为没有逆元就坏了,我们要带入检验,所以直接做就好了
二次互反律有了就能证明勒让德符号了
p,q都是奇质数
qppq=(−1)2p−1∗2q−1
cacb=cab
所以我们可以把什么分子倒过来继续递归之类的...
p55p=(−1)2p−1∗2=1
又因为乘式后面那个一定是1,然后前面也是1
所以我们就可以知道5有二次剩余
5
然后通项公式就有了,就有某一项的答案了
我们ω=21+5
−w1=21−5
ωn+wn(−1)n=c
然后我们试一下是1还是-1,然后我们解出wn,二次方程求根就好了
再用一下bsgs就能找到这个n了吧?
就做完了
直接bsgs不行
我们有264−1=(232−1)(232+1)
这个直接bsgs就能过了
p=p1∗p2∗p3....
a2+b2≡x(modp)
枚举一个a,然后就是看有多少个b
∑a=1p−1(px−a2)
∑a=1p−1(x−a2)2p−1(modp)
你会发现-1和1的奇偶性不一样
这个怎么算呢?
二项式定理!
∑i=02p−1xi∑a=1p−1a2(2p−i−i)
大型UB现场,j是哪来的?
所有这个j都是2p−1第二歩是等比数列求和
2p−1−i=0or2p−1
此时我们还有边界条件,首先0的情况只能是倍数很好知道
然后我们有1和-1的个数是一样的?
f1=1/0
如果f1=0
fn∗f1=f(1∗n)=0
常见积性函数
艾普西龙
当n=1时值为1,否则为0
容斥始祖
然后是约数个数函数,也是积性函数
dn=(e1+1)∗(e2+1)∗(e3+1)...
约数和函数,也是积性函数
d1(n)=(1+p+...+pe1)(1+p+....+pe2)..
可重质因子个数不是积性函数
λ(n)=e1+e2+e3...
满足简单加法
λx+λy=λx+y
然后有phi函数和莫比乌斯函数
都是反演基础了
狄利克雷卷积
网卡了没听qwq
hn=∑d∣nfdgn/d
贝尔级数
Fz=∑n>=1nzf(n)
这个多项式乘法就是f函数的狄利克雷卷积,为啥呢?
f(z)G(z)=n≥1∑n1zf(n1)m≥1∑m2zf(m2)=∑nzfdgn/d
这个就很阳间
对于一个积性函数我们只需要知道质数幂处的取值就能知道所有积性函数了
Fp(z)=∑f(pz)zi
这个就是在质数幂处的贝尔级数
lp(z)=1+z+z2....=1−z1
然后id函数呢?
idpk(z)=1+pk+p2k+p3k...=1−pkx1
μ 函数呢?
1−z,因为剩下都是0
μ2,答案是1+z
ϕ(p)?
=1+p−1+p(p−1)+p2(p−1)
=1+1−pz(p−1)z
=1−pz1−z
也是很显然的
然后μ∗1=宇普西龙的证明就是
1−z1∗(1−z)
ϕpz卷1呢?
1−pz1−z∗(1−z)1
显然了
积性函数求值
∑[pk≤n]=O(lnnn)
我们可能在质数的时候很快,但是在质数幂的时候很慢QAQ
而你会发现质数幂只有$ O(\frac{\sqrt n}{\ln n}) $
k>=2∑lnnkn
然后假设我们对于一个k有O(k3)才能求出
仍然可以!,因为我们这个所以复杂度还是O(n)的
f=f∗1∗μ
然后阳间了起来呢!
gn=∑d∣nfd
fn=∑d∣ngdμ(dn)
[l,h]选择有序n个数形成数组
然后问其中选择的数gcd=k的方案数
这个好像做过,再捋一遍思路吧
首先一定要除掉k,让gcd为1,否则我们不能保证选取两个数,然后让他们gcd至少小于r−l+1
然后就是变成(nr−nl−1)n
∑i=1n2f(i)
2f(i)=∑d∣nμ2(d)
有这个基本事实把/ll就是枚举哪些有没有啊sdsc讲过吧
然后我们考虑
∑d=1nμ2(d)dn
而μ2(n)=∑d2∣nμ(d)
这个就很友好啊qwq
就是考虑容斥,出现一次或者0次的时候就是1,否则就是0
=∑d=1nμ(d)⌊i2n⌋
=∑d=1nμd(∑j=1d2nd(j))
这个积分就是O(nlogn)
∑∑ϕ(ij)
d(nm)=∑i∣m∑j∣n[gcd(i,j)==1]
phi(ij)=phi(i)phi(j)gcd(i,j)/phi(gcd(i,j))
这个生成方式就是考虑质因数展开式中i*j和phi i *phi j的差异就好了
显然要干掉p-1乘上p
也就是说我们只需要枚举一下gcd就好了
∑∑ϕ(ij)∑∑ϕ(gcd(i,j))ϕ(i)ϕ(j)gcd(i,j)d=1∑min(n,m)ϕ(d)di=1∑dnj=1∑dmϕ(id)ϕ(jd)[(i,j)==1]=d=1∑min(n,m)∑
myh咕了
杜教筛
我们要求f的前缀和
然后已经有了g,然后h*g很好求前缀和,g也是
Sn=∑fi
∑i=1ng(i)∑j=1S(in)=∑i=1nh(i)
Sn=∑hi−∑i=2ngiS(in)
然后直接数论分块
然后预处理前n2/3的前缀和即可
我们的复杂度就是对对对的O(n2/3)
如果我们使用map实现记忆化有精彩的分析可以知道只有O(nlogn+n2/3)
嵌套杜教筛复杂度不变
只需要记忆化
简单分块
构造杜教筛可以用贝尔级数构造
首先μϕ可以直接构造
fn=nk∗μ(n)
我们使用n^k即可
∑d∣ndnkfd=nk∑d∣ndkd−kμ(n/d)=nk[n==1]
就做完了
∑∑ijgcd(i,j)
∑∑ij∑d∣i,d∣jϕd
∑d=1nd2ϕ(d)(∑dni)2
如果有一些积性函数能在dn处求出前缀和
那么我们有一些牛逼的积性函数的快速算法
fp=gp
然后h=f/g,g=hg
$\sum_{i=1}nf_i=\sum_{i=1}n(\sum_{d|i}g(d)h(i/d)) $
=∑i=1nh(i)(∑j=1ingj)
powerfulnumber是一个所有质因子指数都大于1的数
不难发现我们可以dfs找出所有powerfulnumber
所以每个质因子大于n的一定可以写成
a2b3
的形式,那么我们考虑有多少小于的等于他的,显然是O(n)
而且远远跑不满
p xor c
fp=p−1+2[p==2]
就是一个多项式的形式啦
然后这个函数的幂次也能快速求值
比如-1,我们直接变为1,然后最后乘上-1
然后p就是直接做了
powerfulnumber
我们考虑把2的弄出来然后容掉就好了
fn=2λ(n)
问Sn,n≤1e13
mod998244353
这个没有实际意义吗?
fp=2
dp=2
然后我们可以用O(n)
复杂度来算这个前缀和?
只对于powerfulnumbers算一遍复杂度很低的qaq
∑i=1n∑j=13i2ni2j2n
然后我们这个东西就是O(n)
Min25筛
对于更加一般化的积性函数求前缀和
fp的形式能写成一个易于求积性函数的形式就好搞
就是完全积性函数的形式
比如ap2+bp+c,我们只考虑p,p^2的和,最后乘上系数就好了
可以认为先求n/d处的f_p前缀和再去解决剩下的
fprimec=gprimec,但是f4不一定为g4
第一遍我们把2的倍数但不是质数删掉
然后再删3,继续这个过程
你会发现最小质因数一定小于等于n
现在枚举了一个新的pj,我们想要减去所有最小质因子为pj且不是pj
的数的贡献
那你会发现一定要大于等于pj2
si,j=si,j−1−fpj∗(si/pj,j−1−spj−1,j−1)
相当于我们减去最小质因子的贡献,所以我们有第一项
然后我们会多减去所以小于pj的质数,就是后面那个,你发现只有质数会被统计入后面
然后怎么求出答案
这一部分是和powerfulnumber很像
getf就是根据这个质数来得到
然后答案的式子就和loj上那个式子一样直接模拟去算即可
有两种情况
第一是pi∗ck,c的最小质因子对于p_i
第二部分是pic
这个复杂度是O(n1−ω)
在n≤1e14确实是对的,复杂度是O(lnnn3/4)
还能计算出所有n/d处的值啊
然后又是一个
我们删掉的数一定是类似pjk∗q,所以这样的形式就能枚举
q的最小质因子是大于pj的
i=1∑nj∣m!∑d(i,j)=i=1∑nj∣m!∑i′∣i∑j′∣j∑[gcd(i′,j′)==1]=d=1∑nμ(d)i=1∑n/dd(i)d∣j′,j∣m!∑1=
然后最后一个东西就是
∏p(2vp(m!)+1)
vp(m!)=∑i≥1pim
然后vp(m!)=p!m(p>m)
然后就是有了,一个区间的质数个数
然后不学了