洛谷网校:数论(二)
2020.1.29
数论(二)
1.线性组合
给定整数{x1,x2,x3,...,xn}和k
求任意一组整数{a1,a2,a3,...,an}
满足a1x1+a2x2+a3x3+...+anxn=k,或返回无解。
解法
设d=gcd(x1,x2,...,xn)显然仅当d|k时有解(k可以看成n组d的和)
若n=1则直接令a1= k/x1。(只有一个数)
否则用gcd(xn−1,xn)代替xn-1和xn,递归构造解;(将两个数合并成一个)
回溯时调用exgcd(xn−1,xn),求出相应的an-1,an,使an-1xn-1+anxn=gcd(xn-1,xn)
用xn−1,xn的线性组合替代 (xn−1, xn)。
2.逆元
若ax≡1(mod b),则称x是a关于模b的逆元,常记做a−1。(和a的倒数不同!这里指只要符合ax%b=1就可,也就是说ax的值可以是:1,b+1,···,yb+1(y为任意整数))
上式等价于ax+by=1(ax,by异号)
因此逆元不一定存在,存在的充要条件为gcd(a,b)=1(a,b互质,若不互质,a模b余数一定整除gcd(a,b))
推论:如果p是质数,且p不整除a(互质),则a模p的逆元存在。
证明:[0,b)的范围内,a关于模b的逆元(整数)(若存在)是唯一的。
定义式可化为:ax%b=1,在这个式子中,x=0和x=b是等价的
反证法,若a有两个逆元0<x1<x2<b
即ax1≡ax2≡1(mod b)(两积同余1)
那么有b|a(x2−x1)成立(余数相减抵消,故:b|(ax2-ax1)),与0<x2−x1<b矛盾
求逆元
1.exgcd
因为gcd(a,b)=1
所以exgcd求的ax+by=gcd(a,b)就是ax+by=1
2.递推
假设现在要求i mod 质数p的逆元
考虑带余除法,设p=iq+r,q=p/i,r=p%i
则有iq+r≡0(mod p)(二者相等,商0余0)
注意到p是质数,因此r不为0(若r为0,则p有除1和本身以外的因数,故r不为0),r的逆元存在(gcd(r,p)=1,任何非零数和质数互质)
iq+r≡0(mod p)两边乘i−1r−1,(这里-1不是倒数,是逆元!i·i-1%p=1,r·r-1%p=1)因为i·i-1=yp+1,r·r-1=y0p+1,所以:
原式 –> qr-1(yp+1)+i-1(y0p+1)≡0(mod p) –> qr-1yp+qr-1+i-1y0p+i-1≡0(mod p) –> qr-1+r≡0(mod p) (将多项式中带有p的项消掉了)
推得式子:qr−1+i−1≡0(mod p) –> qr−1+i-1=i-1-(-qr-1)
易证:若a+b%c=0,那么a≡-1b(mod c),q=p/i,r=p%i
因此i−1≡−qr−1≡−(p/i)(p%i)−1(mod p) –> i-1%p=−qr−1%p –> i-1=kr-1-qr-1%p(k为正整数,保证kr-1和qr-1的差大于0)
因为r·r-1=yp+1,所以r-1=(yp+1)/r,
代码
for(inv[1]=1,i=2;i<=n;i++)//1%任何大于1的数都是1,所以inv[1]=1
inv[i]=(p-q)*inv[r]%p;//这里的k取p,因为q永远不会比p大,所以p作k足矣
3.倒推
先用方法1(exgcd)求n!的逆元(注:这里所有bulabula-1都是逆元,不是倒数)
推导:((k-1)!·((k-1)!)-1)%p=1 –> ((k-1)!)-1·(k-1)!=xp+1 –> ((k-1)!)-1=(xp+1)/(k-1)! (x和下面的y是正整数,x=(((k-1)!)-1·(k-1)!)/p),y=(k!·(k!)-1)/p)
同理:(k!)-1=(yp+1)/k! –> k·(k!)-1=(yp+1)/(k-1)!
因为:xp+1≡yp+1(mod p)(同余1)
所以:(xp+1)/(k-1)!≡(yp+1)/(k-1)!(mod p)(在整除的情况下成立,并且由于xp+1,yp+1本就是乘出来的,所以保证了整除)
可得:((k−1)!)−1≡k·(k!)−1(mod p)
最后:((k-1)!)-1=k·(k!)-1%p(逆元永远大于0小于取模的p,所以可以求得唯一的逆元)
这样就可以倒推求出1!~(n − 1)!的逆元
因为要求k的逆元,所以继续推导:
根据定义:k·k-1=xp+1(x为正整数,x=(k·k-1)/p)
推得:k-1=(xp+1)/k
同理:(k!)-1=(yp+1)/k!
等式两边同乘(k-1)!:(k-1)!·(k!)-1=(yp+1)/k
因为:(xp+1)%p=1,(yp+1)%p=1
所以:(xp+1)/k≡(yp+1)/k(mod p)
也就是:k−1≡(k−1)!·(k!)−1(mod p)
最后:k-1=((k−1)!·(k!)−1)%p
就可以求出1~n的逆元了
例题:组合数取模
求C(n, k)%998244353(一个质数)
T≤105,0≤k≤n≤107
公式:
要求:O(1)回答询问
线性求逆,预处理n!以及n!的逆元
那么Cn,k=n!·(k!)-1·((n-k)!)-1 (因为要取模,所以除以一个数就相当于乘这个数和取模数的逆元)
3.线性同余方程
形如ax≡c(mod b)的方程,称为线性同余方程。
等价于ax+by=c(x,y有正有负)因此有解条件为gcd(a,b)|c
若(a,b)=1,则x有唯一解x≡a−1·c(mod b)(逆元不是倒数)
推导:易证c和c%b在方程中等价,所以使c=c%b
设整数k=(a·a-1)/b,所以a·a-1=kb+1
所以:c·a·a-1=k·b·c+c
整理得:c·a·a-1-b·k·c=c
很显然,在ax+by=c方程中,x=c·a-1,y=-k·c(我们不关心y是多少)
当然,a-1·c是可以大于b的,所以要求x,要给a-1·c取模
a,b不互质的情况:
设gcd(a,b)=d a=a′d b=b′d c=c′d
(这时a,b不互质,加上之前交代的有解条件gcd(a,b)|c,所以d=gcd(a,b,c))
所以a′,b′互质,按照互质的情况求出a′x+b′y=c′的解,因为等式两边同除以d,所以在这里求出的x,y在原方程仍然适用
线性同余方程组
考虑形如 x ≡ ai(mod mi) 的若干方程联立得到的方程组,如:
x≡2(mod 3) (1)
x≡3(mod 5) (2)
x≡5(mod 7) (3)
解法:
设x=3y+2,代入(2)
3y+2≡3(mod 5) –> 3y≡1(mod 5)
gcd(3,5)=1
3-1(mod 5)=2
由线性同余方程解法可得:y≡2*1(mod 5)
解得y≡2(mod 5)
设y=5z+2,代入(3)
3(5z+2)+2≡5(mod 7) –> 15z+6+2≡5(mod 7) –> 15z+8≡5(mod 7) –> 15z≡-3(mod 7) –> 15z≡4(mod 7)
gcd(15,7)=1
15-1(mod)=1
由线性同余方程解法可得:z=4*1(mod 7)
解得z≡4(mod 7)(z%7=4)
设z=7k+4,带回y=5z+2
y=5(7k+4)+2=35k+20+2=35k+22
带回x=3y+2
x=3(35k+22)+2=105k+68
x%105=68
也就是:x≡68(mod 105)
中国剩余定理
对于同余方程组x≡ai(mod mi)(i=1~n)
设M=m1m2...mn,Mi=M/mi
若mi两两互质,则x在mod M下有唯一解。
中国剩余定理同时也给出了构造解的方法:
因为mi两两互质,所以mi的质因数在Mi中不出现,所以gcd(Mi,mi)=1,所以Mi关于模mi的逆元存在。(逆元定义)
把这个逆元设为ti,于是有:
Miti≡1(mod mi)
设正整数j/=i
因为mj是Mi的因子,所以Mi%mj=0
因为ti是整数,所以:Miti%mj=0
前面有:Miti≡1(mod mi)
等式两边同时乘ai,得:aiMiti≡ai(mod mi)
同理:aiMiti≡0(mod mj)
所以每个(aiMiti)只对自己对应的mi取模时有余数,对其他mj取模答案都为0,这样一来,如果把所有(aiMiti)都加起来,用这个和对M取模后的余数只有ai,满足i取任意正整数时,x≡ai(mod mi)的要求,也就解出了方程组
因此解为x≡a1M1t1+a2M2t2+...+anMntn(mod M)
代码:
int crt(int a[],int m[],int n) {//不是递归
int M=1,ret=0;//ret就是x的解的余数部分(模数部分就是M)
for(int i=1;i<=n;i++)
M*=m[i];//累乘M
for(int i=1;i<=n;i++) {
int Mi=M/m[i],ti=inv(Mi,m[i]);//Mi随用随算,逆元函数提前写好
ret=(ret+a[i]*Mi*ti)%M;//累乘处理ret
}
return ret;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)