0x33 同余

0x33 同余

定义

若整数 a a a和整数 b b b除以正整数 m m m的余数相等,则称 a , b a,b a,b m m m同余,记为 a ≡ b ( m o d m ) a\equiv b(mod\ m) ab(mod m)

同余类与剩余类

对于 ∀ a ∈ [ 0 , m − 1 ] \forall a\in[0,m-1] a[0,m1],集合 { a + k m } ( k ∈ Z ) \{a+km\}(k\in Z) {a+km}(kZ)的所有数模 m m m同余,余数都是 a a a。该集合称为一个模 m m m同余类,简记为 a ‾ \overline{a} a

m m m的同余类一共有 m m m个,分别为 0 ‾ , 1 ‾ , 2 ‾ , . . . , m − 1 ‾ \overline0,\overline1,\overline2,...,\overline{m-1} 0,1,2,...,m1。它们构成 m m m完全剩余类

1 ∼ m 1\sim m 1m中与 m m m互质的数代表的同余类共有 ϕ ( m ) \phi(m) ϕ(m)个,它们构成 m m m简化剩余类。例如,模10的简化剩余类为 { 1 ‾ , 3 ‾ , 7 ‾ , 9 ‾ } \{\overline1,\overline3,\overline7,\overline9 \} {1,3,7,9}

简化剩余关系关于模 m m m乘法封闭。这是因为若 a , b ( 1 ≤ a , b ≤ m ) a,b(1\leq a,b \leq m) a,b(1a,bm) m m m互质,则 a ∗ b a*b ab也不可能与 m m m含有相同的因子,即 a ∗ b a*b ab也与 m m m互质。再由余数的定义即可得到 a ∗ b m o d m a*b\bmod m abmodm也与 m m m互质, a ∗ b m o d m a*b\bmod m abmodm也属于 m m m的简化剩余类。

费马小定理

p p p是质数,则对于任意整数 a a a,有 a p ≡ a ( m o d p ) a^p\equiv a(\bmod p) apa(modp)

欧拉定理

若正整数 a , n a,n a,n互质,则 a ϕ ( n ) ≡ 1 ( m o d n ) a^{\phi(n)}\equiv 1(\bmod n) aϕ(n)1(modn),其中 ϕ ( n ) \phi(n) ϕ(n)为欧拉函数。

证明:
n n n的简化剩余类为 a 1 ‾ , a 2 ‾ , . . . , a ϕ ( n ) ‾ {\overline{a_1},\overline{a_2},...,\overline{a_{\phi(n)}}} a1,a2,...,aϕ(n)。对于 ∀ a i , a j \forall a_i,a_j ai,aj,若 a ∗ a i ≡ a ∗ a j ( m o d n ) a*a_i\equiv a*a_j(\bmod n) aaiaaj(modn),则 a ∗ ( a i − a j ) ≡ 0 a*(a_i-a_j)\equiv 0 a(aiaj)0。因为 a , n a,n a,n互质,所以 a i − a j ≡ 0 a_i-a_j\equiv 0 aiaj0,即当 a i ≡ a j a_i\equiv a_j aiaj。故当 a i ≠ a j a_i\neq a_j ai=aj时, a a i , a a j aa_i,aa_j aai,aaj也代表不同的同余类。

又因为简化剩余系关于模 n n n乘法封闭,故 a a i ‾ \overline{aa_i} aai也在简化剩余系集合中。因此,集合 { a 1 ‾ , a 2 ‾ , . . . , a ϕ ( n ) ‾ } \{\overline{a_1},\overline{a_2},...,\overline{a_{\phi(n)}} \} {a1,a2,...,aϕ(n)}与集合 { a a 1 ‾ , a a 2 ‾ , . . . , a a ϕ ( n ) ‾ } \{\overline{aa_1},\overline{aa_2},...,\overline{aa_{\phi(n)}} \} {aa1,aa2,...,aaϕ(n)}都能表示 n n n的简化剩余类。综上所述:
a ϕ ( n ) a 1 a 2 . . . a ϕ ( n ) ≡ ( a a 1 ) ( a a 2 ) . . . ( a a ϕ ( n ) ) ≡ a 1 a 2 . . . a ϕ ( n ) ( m o d n ) a^{\phi(n)}a_1a_2...a_{\phi(n)}\equiv (aa_1)(aa_2)...(aa_{\phi(n)})\equiv a_1a_2...a_{\phi(n)}(\bmod n) aϕ(n)a1a2...aϕ(n)(aa1)(aa2)...(aaϕ(n))a1a2...aϕ(n)(modn)
因此 a ϕ ( n ) ≡ 1 ( m o d n ) a^{\phi(n)}\equiv 1(\bmod n) aϕ(n)1(modn)

p p p是质数时, ϕ ( p ) = p − 1 \phi(p)=p-1 ϕ(p)=p1,并且只有 p p p的倍数与 p p p不互质。所以,只要 a a a不是 p p p的倍数,就有 a p − 1 ≡ 1 ( m o d p ) a^{p-1}\equiv 1(\bmod p) ap11(modp),两边同乘 a a a就是费马小定理。另外,若 a a a p p p的倍数,费马小定理显然成立(取模之后结果为0)。

欧拉定理的推论

设正整数 a , n a,n a,n互质,则对于任意正整数 b b b,有 a b ≡ a b m o d ϕ ( n ) ( m o d n ) a^b\equiv a^{b\bmod \phi(n)}(\bmod n) ababmodϕ(n)(modn)

证明:

b = q ∗ ϕ ( n ) + r b=q*\phi(n)+r b=qϕ(n)+r,其中 0 ≤ r ≤ ϕ ( n ) 0\leq r\leq \phi(n) 0rϕ(n),即 r = b m o d ϕ ( n ) r=b\bmod \phi(n) r=bmodϕ(n)。于是:
a b ≡ a q ∗ ϕ ( n ) + r ≡ ( a ϕ ( n ) ) q ∗ a r ≡ a r ≡ a b m o d ϕ ( n ) ( m o d n ) a^b\equiv a^{q*\phi(n)+r}\equiv(a^{\phi(n)})^q*a^r\equiv a^r\equiv a^{b\bmod \phi(n)}(\bmod n) abaqϕ(n)+r(aϕ(n))qararabmodϕ(n)(modn)
许多计数类的题目要求我们把答案对一个质数 p p p取模后输出。面对 a + b , a − b , a ∗ b a+b,a-b,a*b a+b,ab,ab这样的算式,可以在计算前先把 a , b a,b a,b p p p取模。面对乘方算式,根据欧拉定理的推论,可以先把底数对 p p p取模、指数对 ϕ ( p ) \phi(p) ϕ(p)取模,再计算乘方。

特别地, a , n a,n a,n不一定互质且 b > ϕ ( n ) b>\phi(n) b>ϕ(n)时,有 a b ≡ a b m o d ϕ ( n ) + ϕ ( n ) ( m o d n ) a^b\equiv a^{b\bmod \phi(n)+\phi(n)}(\bmod n) ababmodϕ(n)+ϕ(n)(modn)这意味着即使底数与模数不互质,我们也有办法把指数地规模缩小到容易计算地范围内。上式可以通过寻找 a b m o d n a^b \bmod n abmodn指数循环节证明,可以自行思考。

1.扩展欧几里得算法

B e ˊ z o u t Bézout Beˊzout定理

对于任意整数 a , b a,b a,b,存在一对整数 x , y x,y x,y,满足 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)

证明:

在欧几里得算法的最后一步,即 b = 0 b=0 b=0时,显然有一对整数 x = 1 , y = 0 x=1,y=0 x=1,y=0,使得 a ∗ 1 + b ∗ 0 = g c d ( a , 0 ) a*1+b*0=gcd(a,0) a1+b0=gcd(a,0)

b > 0 b>0 b>0,则 g c d ( a , b ) = g c d ( b , a m o d b ) gcd(a,b)=gcd(b,a\bmod b) gcd(a,b)=gcd(b,amodb)。假设存在一对整数 x , y x,y x,y,满足 b ∗ x + ( a m o d b ) ∗ y = g c d ( b , a m o d b ) b*x+(a\bmod b)*y=gcd(b,a\bmod b) bx+(amodb)y=gcd(b,amodb),因为 b x + ( a m o d b ) y = b x + ( a − b ⌊ a / b ⌋ ) y = a y + b ( x − ⌊ a / b ⌋ y ) bx+(a\bmod b)y=bx+(a-b\lfloor a/b \rfloor)y=ay+b(x-\lfloor a/b\rfloor y) bx+(amodb)y=bx+(aba/b⌋)y=ay+b(xa/by),所以令 x ′ = y , y ′ = x − ⌊ a / b ⌋ y x^{\prime}=y, y^{\prime}=x-\lfloor a / b\rfloor y x=y,y=xa/by,就得到了 a x ′ + b y ′ = g c d ( a , b ) ax^{\prime}+by^{\prime}=gcd(a,b) ax+by=gcd(a,b)

对于欧几里得算法的递归过程中应用数学归纳法,可知 B e ˊ z o u t Bézout Beˊzout定理成立。

B e ˊ z o u t Bézout Beˊzout定理是按照欧几里得算法的思路证明的,且上述证明方法同时给出了整数 x x x y y y的计算方法。这种计算方法称为扩展欧几里得算法。

int exgcd(int a,int b,int &x,int &y)
{if(b==0){x=1,y=0;return a;}int d=exgcd(b,a%b,x,y);int z=x;x=y;y=z-y*(a/b);return d;
}

定义变量 d , x 0 , y 0 d,x_0,y_0 d,x0,y0,调用 d = e x g c d ( a , b , x 0 , y 0 ) d=exgcd(a,b,x0,y0) d=exgcd(a,b,x0,y0)。注意在上述代码中, x 0 , y 0 x_0,y_0 x0,y0是以引用的方式传递的。上述程序求出方程 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)的一组特解 x 0 , y 0 x_0,y_0 x0,y0,并返回 a , b a,b a,b的最大公约数 d d d

对于更为一般的方程 a x + b y = c ax+by=c ax+by=c,它有解当且仅当 d ∣ c d\mid c dc。我们可以先求出 a x + b y = d ax+by=d ax+by=d的一组特解 x 0 , y 0 x_0,y_0 x0,y0,然后令 x 0 , y 0 x_0,y_0 x0,y0同时乘上 c / d c/d c/d,就得到了 a x + b y = c ax+by=c ax+by=c的一组特解 ( c / d ) x 0 , ( c / d ) y 0 (c/d)x_0,(c/d)y_0 (c/d)x0,(c/d)y0

事实上,方程 a x + b y = c ax+by=c ax+by=c的通解可以表示为:
x = c d x 0 + k b d , y = c d y 0 − k a d ( k ∈ Z ) x=\frac{c}{d}x_0+k\frac{b}{d},y=\frac{c}{d}y_0-k\frac{a}{d}(k\in Z) x=dcx0+kdb,y=dcy0kda(kZ)
其中 k k k取遍整数集合, d = g c d ( a , b ) , x 0 , y 0 d=gcd(a,b),x_0,y_0 d=gcd(a,b),x0,y0 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)的一组特解。

乘法逆元

若整数 b , m b,m b,m互质,并且 b ∣ a b\mid a ba,则存在一个整数 x x x,使得 a / b ≡ a ∗ x ( m o d m ) a/b\equiv a*x(\bmod m) a/bax(modm)。称 x x x b b b的模 m m m乘法逆元,记为 b − 1 ( m o d m ) b^{-1}(\bmod m) b1(modm)

因为 a / b ≡ a ∗ b − 1 ≡ a / b ∗ b ∗ b − 1 ( m o d m ) a/b\equiv a*b^{-1}\equiv a/b*b*b^{-1}(\bmod m) a/bab1a/bbb1(modm),所以 b ∗ b − 1 ≡ 1 ( m o d m ) b*b^{-1}\equiv 1(\bmod m) bb11(modm)

如果 m m m是质数(此时我们用符号 p p p代替 m m m),并且 b < p b<p b<p,根据费马小定理, b p − 1 ≡ 1 ( m o d p ) b^{p-1}\equiv 1(\bmod p) bp11(modp),即 b ∗ b p − 2 ≡ 1 ( m o d p ) b*b^{p-2}\equiv 1(\bmod p) bbp21(modp)。因此,当模数 p p p为质数时, b p − 2 b^{p-2} bp2即为 b b b的乘法逆元。

如果只是保证 b , m b,m b,m互质,那么乘法逆元可通过求解同余方程 b ∗ x ≡ 1 ( m o d m ) b*x\equiv 1(\bmod m) bx1(modm)得到。下个部分我们就来介绍线性同余方程及其求解方法。

有了乘法逆元,我们在计数类问题中即使遇到 a / b a/b a/b这样的除法算式,也可以先把 a , b a,b a,b各自对模数 p p p取模,再计算 a ∗ b − 1 m o d p a*b^{-1}\bmod p ab1modp作为最终的结果。当然,前提必须保证 b , p b,p b,p互质(当 p p p是质数时,等价于 b b b不是 p p p的倍数)。

到目前为止,我们在模 p p p运算下对加、减、乘、除、乘方运算都已经有了适当的处理方式。

2.线性同余方程

给定整数 a , b , m a,b,m a,b,m,求一个整数 x x x满足 a ∗ x ≡ b ( m o d m ) a*x\equiv b(\bmod m) axb(modm),或者给出无解。因为未知数的指数为1,所以我们称之为一次同余方程,也称为线性同余方程。

a ∗ x ≡ b ( m o d m ) a*x\equiv b(\bmod m) axb(modm)等价于 a ∗ x − b a*x-b axb m m m的倍数,不妨设为 − y -y y倍。于是,该方程可以改写为 a ∗ x + m ∗ y = b a*x+m*y=b ax+my=b

根据 B e ˊ z o u t Bézout Beˊzout定理及其证明过程,线性同余方程有解当且仅当 g c d ( a , m ) ∣ b gcd(a,m)\mid b gcd(a,m)b

在有解时,先用欧几里得算法求出一组整数 x 0 , y 0 x_0,y_0 x0,y0,满足 a ∗ x 0 + m ∗ y 0 = g c d ( a , m ) a*x_0+m*y_0=gcd(a,m) ax0+my0=gcd(a,m)。然后 x = x 0 ∗ b / g c d ( a , m ) x=x_0*b/gcd(a,m) x=x0b/gcd(a,m)就是原线性同余方程的一个解。

方程的通解则是所有模 m / g c d ( a , m ) m/gcd(a,m) m/gcd(a,m) x x x同余的整数。

由上述线性同余方程的知识可得, a ∗ x ≡ 1 ( m o d b ) a*x\equiv 1(\bmod b) ax1(modb)有解当且仅当 g c d ( a , b ) = 1 gcd(a,b)=1 gcd(a,b)=1。方程可以改写为 a ∗ x + b ∗ y = 1 a*x+b*y=1 ax+by=1,用欧几里得算法求出一组特解 x 0 , y 0 x_0,y_0 x0,y0,则 x 0 x_0 x0就是原方程的一个解,通解为所有模 b b b x 0 x_0 x0同余的整数。通过取模操作把解的范围移动到 1 ∼ b 1\sim b 1b之间,就得到了最小正整数。

typedef long long ll;
ll a,b,x,y;
ll exgcd(ll a,ll b,ll &x,ll &y)
{if(!b){x=1,y=0;return a;}ll d=exgcd(b,a%b,x,y);ll z=x;x=y;y=z-y*(a/b);return d;
}
int main()
{cin>>a>>b;exgcd(a,b,x,y);cout<<(x%b+b)%b<<endl; //注意通过同余方程求出的解可能为负数记得要加上一个b
}

中国剩余定理

m 1 , m 2 , . . . , m n m_1,m_2,...,m_n m1,m2,...,mn是两两互质的整数, m = ∏ i = 1 n m i , M i = m / m i , t i m=\prod_{i=1}^{n}m_i,M_i=m/m_i,t_i m=i=1nmi,Mi=m/mi,ti是线性同余方程 M i t i ≡ 1 ( m o d m i ) M_it_i\equiv 1(\bmod m_i) Miti1(modmi)的一个解。对于任意的 n n n个整数 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an,方程组
{ x ≡ a 1 ( m o d m 1 ) x ≡ a 2 ( m o d m 2 ) ⋮ x ≡ a n ( m o d m n ) \left\{\begin{array}{c} x \equiv a_{1}\left(\bmod m_{1}\right) \\ x \equiv a_{2}\left(\bmod m_{2}\right) \\ \vdots \\ x \equiv a_{n}\left(\bmod m_{n}\right) \end{array}\right. xa1(modm1)xa2(modm2)xan(modmn)
有整数解,解为 x = ∑ i = 1 n a i M i t i x=\sum_{i=1}^n a_iM_it_i x=i=1naiMiti

证明:
因为 M i = m / m i M_i=m/m_i Mi=m/mi是除 m i m_i mi之外所有模数的倍数,所以 ∀ k ≠ i , a i M i t i ≡ 0 ( m o d m k ) \forall k\neq i,a_iM_it_i\equiv 0(\bmod m_k) k=i,aiMiti0(modmk)。又因为 a i M i t i ≡ a i ( m o d m i ) a_iM_it_i\equiv a_i(\bmod m_i) aiMitiai(modmi),所以代入 x = ∑ i = 1 n a i M i t i x=\sum_{i=1}^n a_iM_it_i x=i=1naiMiti,原方程组成立。

另外,即使模数不满足两两互质,我们也有方法判断线性同余方程组是否有解,并求出方程组的解。可以考虑使用数学归纳法,假设已经求出了前 k − 1 k-1 k1个方程构成的方程组的一个解 x x x。记 m = l c m ( m 1 , m 2 , . . . , m k − 1 ) m=lcm(m_1,m_2,...,m_{k-1}) m=lcm(m1,m2,...,mk1),则 x + i ∗ m ( i ∈ Z ) x+i*m(i\in Z) x+im(iZ)是前 k − 1 k-1 k1个方程的通解。

考虑第 k k k个方程,求出一个整数 t t t,使得 x + t ∗ m ≡ a k ( m o d m k ) x+t*m\equiv a_k(\bmod m_k) x+tmak(modmk)。该方程等价于 m ∗ t ≡ a k − x ( m o d m k ) m*t\equiv a_k-x(\bmod m_k) mtakx(modmk),其中 t t t是未知量。这就是一个线性同余方程,可以用扩展欧几里得算法判断是否有解,并求出它的解。若有解,则 x ′ = x + t ∗ m x^{\prime}=x+t*m x=x+tm就是前 k k k个方程构成的方程组的一个解。

综上所述,我们使用了 n n n次扩展欧几里得算法,就求出了整个方程组的解。

3.高次同余方程

关于高次同余方程,有 a x ≡ b ( m o d p ) a^x\equiv b(\bmod p) axb(modp) x a ≡ b ( m o d p ) x^a\equiv b(\bmod p) xab(modp)两类问题。不过后者超出了我们的讨论范围,可以自行查阅“原根”“阶”“指标”的相关资料。我们重点来解决前者。

问题:给定整数 a , b , p a,b,p a,b,p,其中 a , p a,p a,p互质,求一个非负整数 x x x,使得 a x ≡ b ( m o d p ) a^x\equiv b(\bmod p) axb(modp)

Baby Step,Gaint Step算法

因为 a , p a,p a,p互质,所以可以在模 p p p意义下执行关于 a a a的乘、除法运算。

x = i ∗ t − j x=i*t-j x=itj,其中 t = ⌈ p ⌉ , 0 ≤ j ≤ t − 1 t=\lceil \sqrt{p} \rceil,0\leq j\leq t-1 t=p ,0jt1,则方程变为 a i ∗ t − j ≡ b ( m o d p ) a^{i*t-j}\equiv b(\bmod p) aitjb(modp)。即 ( a t ) i ≡ b ∗ a j ( m o d p ) (a^t)^i\equiv b*a^j(\bmod p) (at)ibaj(modp)

对于所有的 j ∈ [ 0 , t − 1 ] j\in[0,t-1] j[0,t1],把 b ∗ a j m o d p b*a^j\bmod p bajmodp插入一个Hash表。

枚举 i i i的所有可能取值,即 i ∈ [ 0 , t ] i\in[0,t] i[0,t],计算出 ( a t ) i m o d p (a^t)^i\bmod p (at)imodp,在Hash表中查找是否存在对应的 j j j,更新答案即可。时间复杂度 O ( p ) O(\sqrt{p}) O(p )

下面的程序实现了Baby Step,Gaint Step算法,计算同余方程 a x ≡ b ( m o d p ) a^x\equiv b(\bmod p) axb(modp)最小非负整数解,无解时返回-1。

int baby_step_giant_step(int a,int b,int p)
{map<int,int> hash;hash.clear();b%=p;int t=(int)sqrt(p)+1;for(int j=0;j<t;++j){int val=(long long)b*power(a,j,p)%p; //b*a^jhash[val]=j;}a=power(a,t,p); //a^tif(a==0) return b==0?1:-1;for(int i=0;i<=t;++i){int val=power(a,i,p); //(a^t)^i;int j= hash.find(val)==hash.end()?-1:hash[val];if(j>=0&&i*t-j>=0) return i*t-j;}return -1;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/610800.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Simpy简介:python仿真模拟库-03/5

一、说明 在过去的两篇文章中&#xff0c;我们了解了 simpy 的基础知识、声明变量和处理表达式。值得注意的例子包括评估导数和积分。现在&#xff0c;让我们继续使用函数。 二、SymPy — 函数类 SymPy 包包含 sympy.core.function 模块中的 Function 类。该类作为各种数学函数…

构建labelstudio镜像的时候,报错node:18,如何解决

解决方案&#xff1a; vi Dockerfile # syntaxdocker/dockerfile:1.3 FROM --platformlinux/amd64 node:18.16-bullseye-slim AS frontend-builder18改成 18.16-bullseye-slim

Spring框架-Spring JDBC

文章目录 Spring JDBC实例1&#xff0c;导入依赖2&#xff0c;配置数据源3&#xff0c;数据库4&#xff0c;实体类5&#xff0c;dao层5&#xff0c;配置Dao Bean6&#xff0c;业务逻辑层7&#xff0c;配置Service Bean8&#xff0c;测试 JdbcTemplate常用方法1,导入依赖2&#…

【漏洞复现】锐捷EG易网关login.php命令注入漏洞

Nx01 产品简介 锐捷EG易网关是一款综合网关&#xff0c;由锐捷网络完全自主研发。它集成了先进的软硬件体系架构&#xff0c;配备了DPI深入分析引擎、行为分析/管理引擎&#xff0c;可以在保证网络出口高效转发的条件下&#xff0c;提供专业的流控功能、出色的URL过滤以及本地化…

【2024系统架构设计】 系统架构设计师第二版-通信系统架构设计理论与实践

目录 一 通信系统网络架构 二 网络构建的关键技术 三 网络构建和设计方法 四 案例分析 注:本节内容可作为知识储备,做一个基本的了解即可。

50天精通Golang(第12天)

channel通道 通道可以被认为是Goroutines通信的管道。类似于管道中的水从一端到另一端的流动&#xff0c;数据可以从一端发送到另一端&#xff0c;通过通道接收。 在前面讲Go语言的并发时候&#xff0c;我们就说过&#xff0c;当多个Goroutine想实现共享数据的时候&#xff0…

Linux-命名管道

文章目录 前言一、命名管道接口函数介绍二、使用步骤 前言 上章内容&#xff0c;我们介绍与使用了管道。上章内容所讲的&#xff0c;是通过pipe接口函数让操作系统给我们申请匿名管道进行进程间通信。 并且这种进程间通信一般只适用于父子进程之间&#xff0c;那么对于两个没有…

原来这些小众知识库软件这么好用,挖到宝了

在企业管理中&#xff0c;知识库的作用越来越被重视。它不仅可以提高工作流程的效率&#xff0c;还可以最大限度地利用企业中的知识资源。然而&#xff0c;在众多的知识库工具中选择一款合适的并非易事。不用担心&#xff0c;今天我要为大家揭晓一些小众却非常好用的知识库软件…

【华为OD机试真题2023CD卷 JAVAJS】中文分词模拟器

华为OD2023(C&D卷)机试题库全覆盖,刷题指南点这里 中文分词模拟器 知识点图字符串 时间限制:5s 空间限制:256MB 限定语言:不限 题目描述: 给定一个连续不包含空格字符串,该字符串仅包含英文小写字母及英文文标点符号(逗号、分号、句号),同时给定词库,对该字符串进…

python函数装饰器基础

1 python函数装饰器基础 python2.5开始支持函数装饰器。装饰器语法&#xff1a;自动调用装饰器函数&#xff0c;返回可调用对象重新绑定到主体函数名。 1.1 基础用法 函数装饰器用法&#xff0c;装饰器函数&#xff0c;下一行接def 主体函数&#xff1a; decorator def fm(…

微信小程序实战-02翻页时钟-2

微信小程序实战系列 《微信小程序实战-01翻页时钟-1》 文章目录 微信小程序实战系列前言计时功能实现clock.wxmlclock.wxssclock.js 运行效果总结 前言 接着《微信小程序实战-01翻页时钟-1》&#xff0c;继续完成“6个页面的静态渲染和计时”功能。 计时功能实现 clock.wxm…

python类装饰器基础

1 python类装饰器基础 类装饰器是管理类的一种方式&#xff0c;不是包装单个函数或方法&#xff0c;而是用装饰器的额外逻辑&#xff0c;来包装实例的构建和调用&#xff0c;从而实现对主体类的扩展。 主体类被装饰后&#xff0c;通过主体类创建实例对象时&#xff0c;自动调…

Linux前后端项目部署

目录 1.jdk&tomcat安装 配置并且测试jdk安装 修改tomcat 配置文件 登入tomcat 发布 安装mysql 导入sql数据 发布项目war包 redis安装 nginx安装 配置nginx域名映射 部署前端项目 centos 7的服务安装 安装jdk 安装tomcat 安装Mysql 安装redis 安装nginx 前后…

【Unity】Timer计时器属性及使用

可以代替协程完成延时操作 可以不用Update进行计时 GitHub开源计时插件 网址&#xff1a;https://github.com/akbiggs/UnityTimer/tree/master 导入&#xff1a;URL&#xff1a;https://github.com/akbiggs/UnityTimer.git 基本功能&#xff1a; 创建计时器&#xff1a; Time…

深入理解 Hadoop (四)HDFS源码剖析

HDFS 集群启动脚本 start-dfs.sh 分析 启动 HDFS 集群总共会涉及到的角色会有 namenode, datanode, zkfc, journalnode, secondaryName 共五种角色。 JournalNode 核心工作和启动流程源码剖析 // 启动 JournalNode 的核心业务方法 public void start() throws IOException …

【打卡】牛客网:BM80 买卖股票的最好时机(一)

模板的&#xff1a; 我的想法是&#xff0c;这个题就是找最大差。两个递归是可以解决的&#xff0c;时间复杂度是o(n^2)。但是题目要求时间复杂度是o(n)。 模板用了一个两行的dp数组&#xff0c;在一次for循环中&#xff0c;更新两行&#xff0c;是亮点。 第一行记录利润。全…

OpenHarmony之hdc

OpenHarmony之hdc 简介 hdc&#xff08;OpenHarmony Device Connector&#xff09;是 OpenHarmony 为开发人员提供的用于调试的命令行工具&#xff0c;通过该工具可以在Windows/Linux/MacOS等系统上与开发机或者模拟器进行交互。 类似于Android的adb&#xff0c;和adb类似&a…

探索Java中的Map:领略键值对的无限魅力

目录 1、前言 2、介绍Map 2.1 什么是Map 2.2 Map的特点 3、常用的Map实现类 3.1 HashMap 3.2 TreeMap 3.3 LinkedHashMap 3.4 Hashtable 3.5 ConcurrentHashMap 4、操作Map的常用方法 5、Map的应用场景 5.1 缓存 5.2 数据存储 5.3 计数器 6、常见问题解答 6.1…

Spring中线程池ThreadPoolTaskExecutor的使用

一、为什么要使用线程池 在项目中使用多线程时&#xff0c;通常建议使用线程池而不是直接使用 new Thread 的方式来创建线程。下面是一些原因&#xff1a; 资源管理和性能优化&#xff1a; 使用线程池可以更好地管理系统资源&#xff0c;控制并发线程数&#xff0c;避免创建过…

SEO 分步教程:初学者掌握的 8 个简单基础知识

如果您刚刚开始使用搜索引擎优化 &#xff08;SEO&#xff09;&#xff0c;那么分步 SEO 教程是有序的。在这一点上&#xff0c;你可能已经听说过一些基本术语&#xff0c;如关键词研究和页面优化。但是&#xff0c;您如何应用迄今为止收集的所有知识呢&#xff1f; 如果您刚刚…