【6】组合计数学习笔记

news2025/3/21 2:05:58

前言

关于今天发现自己连快速幂都忘记怎么写这件事

这篇博客是组合计数基础,由于大部分内容都是 6 6 6 级,所以我就给整个提高级的组合数学评了 6 6 6 级。

组合计数基础

加法原理与乘法原理

加法原理(分类计数原理):完成一件事有 n n n 类方法,第一类办法有 m i m_i mi 种,第二类办法有 m 2 m_2 m2 种……第 n n n 类办法有 m n m_n mn 种,那么完成这件事的方法数(记为 N N N)为:

N = m 1 + m 2 + ⋯ + m n N=m_1+m_2+\dots+m_n N=m1+m2++mn

乘法原理(分步计数原理):完成一件事有 n n n 步,第一类步有 m i m_i mi 种方法,第二步有 m 2 m_2 m2 种方法……第 n n n 步有 m n m_n mn 种方法,那么完成这件事的方法数(记为 N N N)为:

N = m 1 m 2 … m n N=m_1m_2\dots m_n N=m1m2mn

加法原理步骤相互独立,任何一种都能独立完成这件事;乘法原理步骤缺一不可,缺少任意一种就不能完成这件事。

排列与组合

排列:从 n n n 个不同元素中取出 m m m 个元素,按照不同顺序排成一列,叫做从 n n n 个不同元素中取出 m m m 个元素的排列,记作 A n m A^{m}_n Anm

排列数计算公式:

A n m = n ( n − 1 ) ( n − 2 ) … ( n − m + 1 ) = n ! ( n − m ) ! A^{m}_n=n(n-1)(n-2)\dots(n-m+1)=\frac{n!}{(n-m)!} Anm=n(n1)(n2)(nm+1)=(nm)!n!

组合:从 n n n 个不同元素中取出 m m m 个元素,并成一组,叫做从 n n n 个不同元素中取出 m m m 个元素的组合,记作 C n m C^{m}_n Cnm

组合数计算公式:

C n m = A n m A m m = n ( n − 1 ) ( n − 2 ) … ( n − m + 1 ) m ! = n ! m ! ( n − m ) ! C^{m}_n=\frac{A^{m}_n}{A^m_m}=\frac{n(n-1)(n-2)\dots(n-m+1)}{m!}=\frac{n!}{m!(n-m)!} Cnm=AmmAnm=m!n(n1)(n2)(nm+1)=m!(nm)!n!

与顺序有关的为排列问题,与顺序无关的为组合问题。

例题 1 1 1


0 , 1 , 2 , 3 , 4 , 5 0,1,2,3,4,5 0,1,2,3,4,5 可以组成多少个没有重复数字的五位奇数?


由于首位和末位有特殊要求,应该优先安排,以免不合要求的元素占了这两个位置。

先排末位有 C 3 1 C^1_3 C31 种方法,再排首位有 C 4 1 C^1_4 C41 种方法,最后排剩下的有 A 4 3 A^3_4 A43 种方法。

最后由乘法原理得到答案 N N N 为:

N = C 3 1 C 4 1 A 4 3 = 288 N=C^1_3C^1_4A^3_4=288 N=C31C41A43=288

例题 2 2 2


7 7 7 种不同的花种在排成一列的花盆里,若两种葵花不种在中间也不种在两边,有多少不同的种法?


由于特殊的两种葵花有特殊要求,应该优先安排,以免不合要求的元素占了这四个位置。

先排两盆特殊的葵花有 A 4 2 A^2_4 A42 种方法,再排剩下的有 A 5 5 A^5_5 A55 种方法。

最后由乘法原理得到答案 N N N 为:

N = A 4 2 A 5 5 = 1440 N=A^2_4A^5_5=1440 N=A42A55=1440

组合数的性质:

1 1 1 C 0 0 = C n n = 1 C^0_0=C^n_n=1 C00=Cnn=1

2 2 2 C n m = C n n − m C^m_n=C^{n-m}_n Cnm=Cnnm

原因:从 n n n 个不同元素中取出 m m m 个元素,也就是从 n n n 个不同元素中不选择 n − m n-m nm 个元素,方法数一样。

3 3 3 C m n = C m − 1 n − 1 + C m − 1 n C^n_m=C^{n-1}_{m-1}+C^{n}_{m-1} Cmn=Cm1n1+Cm1n

原因:从 n n n 个不同元素中取出 m m m 个元素,如果其中一个元素不取,那么就变成了从 n − 1 n-1 n1 个不同元素中取出 m m m 个元素;如果其中一个元素取,那么就变成了从 n − 1 n-1 n1 个不同元素中取出 m − 1 m-1 m1 个元素。再根据加法原理,得出这条性质。

组合数的求法

求法 1 1 1 :杨辉三角递推(预处理)

适用范围: n , m n,m n,m 较小

根据组合数的第 3 3 3 条性质,可以递推求出某一范围内的所有组合数。由于最后推完会发现其实是杨辉三角,所以也叫杨辉三角递推。

c[0][0]=1;
for(int i=1;i<=k;i++)c[i][0]=c[i][i]=1;
for(int i=1;i<=k;i++)
   for(int j=1;j<i;j++)
      c[i][j]=c[i-1][j]+c[i-1][j-1];

时间复杂度: O ( n m ) O(nm) O(nm)

求法 2 2 2 :逆元(组合数取余)

适用范围:能保证逆元存在时。

由逆元的定义,我们可以推出这个式子:

C n m = n ! m ! ( n − m ) ! = n ! × i n v ( m ! ) × i n v [ ( n − m ) ! ] C^{m}_n=\frac{n!}{m!(n-m)!}=n!\times inv(m!)\times inv[(n-m)!] Cnm=m!(nm)!n!=n!×inv(m!)×inv[(nm)!]

long long power(long long a,long long p,long long m)
{
	long long x=a,ans=1;
	while(p)
	   {
	   	if(p%2==1)ans=(x%m*ans%m)%m;
	   	p/=2;
	   	x=(x%m*x%m)%m;
	   }
	return ans;
}

long long get_c(long long n,long long k,long long m)
{
	k=min(k,n-k);
	long long r1=1,r2=1;
	for(int i=n-k+1;i<=n;i++)r1=(r1%m*i%m)%m;
	for(int i=1;i<=k;i++)r2=(r2%m*i%m)%m;
	return (r1%m*power(r2,m-2,m)%m)%m;
}

对于逆元,直接费马小定理或扩展欧几里得求就行了。【7】逆元学习笔记

时间复杂度: O ( n + m ) O(n+m) O(n+m)

二项式定理

二项式定理基本形式:

( a + b ) n = ∑ k = 0 n C n k a k b n − k (a+b)^n=\sum^{n}_{k=0}C^k_na^kb^{n-k} (a+b)n=k=0nCnkakbnk

那么可以推出:

( a x + b y ) n = ∑ k = 0 n C n k ( a x ) k ( b y ) n − k = ∑ k = 0 n ( C n k a k b n − k ) x k y n − k (ax+by)^n=\sum^{n}_{k=0}C^k_n(ax)^k(by)^{n-k}=\sum^{n}_{k=0}(C^k_na^kb^{n-k})x^ky^{n-k} (ax+by)n=k=0nCnk(ax)k(by)nk=k=0n(Cnkakbnk)xkynk

二项式定理可以通过数学归纳法证明,但因为个人实力有限 (教练没讲),就不证明了。

例题 3 3 3

P1313 [NOIP2011 提高组] 计算系数

用杨辉三角递推求出组合数,直接套用二项式定理计算系数,用快速幂处理 a k b n − k a^kb^{n-k} akbnk 即可。

#include <bits/stdc++.h>
using namespace std;
long long n,m,k,a,b,c[1010][1010];
long long power(long long a,long long p,long long m)
{
	long long x=a,ans=1;
	while(p)
	  {
        if(p%2==1)ans=ans*x%m;
        p/=2;
        x=x*x%m;
	  }
	return ans;
}

int main()
{
	scanf("%lld%lld%lld%lld%lld",&a,&b,&k,&n,&m);
	c[0][0]=1;
	for(long long i=1;i<=k;i++)c[i][0]=c[i][i]=1;
	for(long long i=1;i<=k;i++)
	    for(long long j=1;j<i;j++)
		    c[i][j]=(c[i-1][j]+c[i-1][j-1])%10007;
	printf("%lld\n",((c[k][m]*power(a,n,10007))*power(b,m,10007))%10007); 
	return 0;
}

例题 4 4 4

CF1332E Height All the Same

考虑到可以在一个格子上码上两个方块,易得如果每个格子奇偶性相同,则一定可以到达同样高度。对于任意点对 ( x , y ) (x,y) (x,y),我们可以通过找到一条路,路径上可以互达的两点有一边相邻, x → b → c ⋯ → y x\to b\to c\dots\to y xbcy,每次增加相邻两个点,这样除了 x , y x,y x,y 各自加 1 1 1,其余的点均加 2 2 2,奇偶性不变。

所以,我们每次可以改变两个点的奇偶性。对于 n m nm nm 为奇数的情况,我们一定可以找到一种奇偶性的数有偶数个,每次修改一对为另一种奇偶性。也就是说,对于任意一种初始情况,均可以修改至完全相同。数量为 ( r − l + 1 ) n m (r-l+1)^{nm} (rl+1)nm

对于 n m nm nm 为偶数的情况,只有奇偶数个数均为偶数时才满足要求。考虑枚举奇数数量方案数累加,运用乘法原理求出每种情况的方案数。我们先选位置,如果现在有 i i i 个奇数,则有 C n m i C_{nm}^{i} Cnmi 种选法。设 [ l , r ] [l,r] [l,r] a a a 个奇数, b b b 个偶数,则奇数有 a i a^i ai 种方法,偶数有 b n m − i b^{nm-i} bnmi 种选法。

∑ i = 0 , 2 ∣ i n m C n m i a i b n m − i \sum_{i=0,2\mid i}^{nm}C_{nm}^{i}a^ib^{nm-i} i=0,2inmCnmiaibnmi

看到这个式子,容易联想到二项式定理。但是这个式子不好转化,需要转化为对于每一个 i i i 都有一个计算式。我们考虑用整体减去部分,可是还是不行。顺着这个思路,可以想到利用 − 1 -1 1 的幂构造摆动数列,当 i i i 为奇数时, ( − 1 ) i (-1)^i (1)i 刚好为负数,表示减去奇数项;当 i i i 为偶数时, ( − 1 ) i (-1)^i (1)i 为正数,尽管有重复计算,可是恰好答案中的每种情况算了两遍,最后除以 2 2 2 即可。

( r − l + 1 ) n m − ∑ i = 0 n m ( − 1 ) i C n m i a i b n m − i 2 \frac{(r-l+1)^{nm}-\sum_{i=0}^{nm}(-1)^iC_{nm}^{i}a^ib^{nm-i}}{2} 2(rl+1)nmi=0nm(1)iCnmiaibnmi

直接利用二项式定理进行转化,达到复杂度 O ( log ⁡ ( n m ) ) O(\log(nm)) O(log(nm))

( r − l + 1 ) n m − ( b − a ) n m 2 \frac{(r-l+1)^{nm}-(b-a)^{nm}}{2} 2(rl+1)nm(ba)nm

#include <bits/stdc++.h>
using namespace std;
long long n,m,l,r,mod=998244353;
long long power(long long a,long long p)
{
	long long x=a,ans=1;
	while(p)
	   {
	   	if(p%2==1)ans=ans*x%mod;
	   	p/=2;
	   	x=x*x%mod;
	   }
	return ans;
}

int main()
{
	scanf("%lld%lld%lld%lld",&n,&m,&l,&r);
	if(n*m%2==1)printf("%lld",power(r-l+1,n*m));
	else 
	    {
	    	long long a=(r-l+1)/2,b=0;
	    	if((r-l+1)%2==1&&l%2==1)a++;
	    	b=r-l+1-a;
	    	printf("%lld",(power(r-l+1,n*m)+power((b-a+mod)%mod,n*m))%mod*499122177%mod);
		}
	return 0;
}

Lucas定理

p p p 为质数,则有如下式子:

C n m ≡ C ⌊ n / p ⌋ ⌊ m / p ⌋ × C n % p m % p ( m o d    p ) C_n^m\equiv C_{\lfloor n/p \rfloor}^{\lfloor m/p \rfloor}\times C_{ n\%p }^{m\%p }(mod\;p) CnmCn/pm/p×Cn%pm%p(modp)

证明可以看文末的博客。

例题 5 5 5

P3807 【模板】卢卡斯定理/Lucas 定理

卢卡斯定理模板题,运用卢卡斯定理 C n m ≡ C ⌊ n / p ⌋ ⌊ m / p ⌋ × C n % p m % p ( m o d    p ) C_n^m\equiv C_{\lfloor n/p \rfloor}^{\lfloor m/p \rfloor}\times C_{ n\%p }^{m\%p }(mod\;p) CnmCn/pm/p×Cn%pm%p(modp) 把组合数拆成两部分,一部分为 C n % p m % p C_{ n\%p }^{m\%p } Cn%pm%p ,保证了逆元存在,直接用组合求逆元。另一部分 C ⌊ n / p ⌋ ⌊ m / p ⌋ C_{\lfloor n/p \rfloor}^{\lfloor m/p \rfloor} Cn/pm/p 接着递归就行了。所以,只有 p p p 为质数时才能使用 Lucas 定理。

注意三个实现细节:

1 1 1 m = 0 m=0 m=0 时为递归出口,这里应该返回 1 1 1 而不是 0 0 0

2 2 2 :可以预处理出阶乘来降低时间复杂度。

3 3 3 :当求组合数时如果 m > n m>n m>n 特判返回 0 0 0

#include <bits/stdc++.h>
using namespace std;
long long t,n,k,m,sum[100010];
long long power(long long a,long long p,long long m)
{
	long long x=a,ans=1;
	while(p)
	   {
	   	if(p%2==1)ans=(x%m*ans%m)%m;
	   	p/=2;
	   	x=(x%m*x%m)%m;
	   }
	return ans;
}

long long get_c(long long n,long long k,long long m)
{
	if(k>n)return 0;
	return ((sum[n]%m*power(sum[k],m-2,m)%m)%m*power(sum[n-k],m-2,m)%m)%m;
}

long long lucas(long long n,long long k,long long m)
{
	if(k==0)return 1;
	else return (lucas(n/m,k/m,m)%m*get_c(n%m,k%m,m)%m)%m;
}

int main()
{
	scanf("%lld",&t);
	while(t--)
	   {
	   	scanf("%lld%lld%lld",&n,&k,&m);
	   	sum[0]=1;
	   	for(int i=1;i<=m;i++)sum[i]=(sum[i-1]%m*i%m)%m;
	   	printf("%d\n",lucas(n+k,k,m));
	   }
	return 0;
}

全排列问题

全排列问题

对于字符集 X X X,将 X X X所有元素的可能排列全部枚举出来,对含有 N N N 个元素的集合 X X X ,排列总个数 S S S 为 :

S = N ! S=N! S=N!

定义一个 1 ∼ n 1\sim n 1n 的排列 A A A ,由 1 , 2 … n 1,2\dots n 1,2n n n n 个数字组成。

有重复元素的排列

m 1 m_1 m1 1 1 1,有 m 2 m_2 m2 2 2 2 … \dots ,有 m k m_k mk k k k,
N N N 个元素,排列总个数 S S S 为 :

S = N ! m 1 ! m 2 ! … m k ! S=\frac{N!}{m_1!m_2!\dots m_k!} S=m1!m2!mk!N!

其他杂题

例题 6 6 6

P3197 [HNOI2008]越狱

由于只要有一种相同宗教相邻就会发生越狱,不好求,可以正难则反,用总共的数量减去没有相邻的数量。

对于总共的情况,由于每一个位置都能选择 m m m 个宗教,那么根据乘法原理,总共有 m n m^n mn 种排列方式。

对于没有相邻的情况,第一个位置有 m m m 种选择。由于相邻宗教不相同,那么接下来每个位置就有 m − 1 m-1 m1 种选择。根据乘法原理,总共有 m ( m − 1 ) n − 1 m(m-1)^{n-1} m(m1)n1 种排列方式。

用总共的数量减去不满足的数量,就能得到答案 S S S 了:

S = m n − m ( m − 1 ) n − 1 S=m^n-m(m-1)^{n-1} S=mnm(m1)n1

注意减法取模要先加上模数。

#include <bits/stdc++.h>
using namespace std;
long long m,n,mod=100003;
long long power(long long a,long long p,long long m)
{
	long long x=a,ans=1;
	while(p)
	   {
	   	if(p%2==1)ans=ans*x%m;
	   	p/=2;
	   	x=x*x%m;
	   }
	return ans;
}

int main()
{
	scanf("%lld%lld",&m,&n);
	printf("%lld",((power(m,n,mod)-m*power(m-1,n-1,mod))%mod+mod)%mod);
	return 0;
}

例题 7 7 7

P4821 [中山市选]生成树

由于生成树中没有环,而每个五边形都构成了一个环,所以每个五边形至少需要拆掉一条边。

而一个五角星圈中间的部分也是一个环,也需要拆掉一条边。所以,会有一个五边形被拆掉两条边。

选择被拆掉两条边的五边形有 n n n 种选法,拆掉两条边的五边形必须拆掉其在中间部分的边,剩下 4 4 4 条边可以任意选择一条拆掉。剩下的 n − 1 n-1 n1 个五边形拆掉哪条边没有限制,每个有 5 5 5 种拆法,根据乘法原理,共有 5 n − 1 5^{n-1} 5n1 种。

最后根据乘法原理,得到答案 S S S 为:

S = 5 n − 1 4 n S=5^{n-1}4n S=5n14n

#include <bits/stdc++.h>
using namespace std;
int t,n,mod=2007;
int power(int a,int p,int m)
{
	int x=a,ans=1;
	while(p)
	   {
	   	if(p%2==1)ans=ans*x%m;
	   	p/=2;
	   	x=x*x%m;
	   }
	return ans;
}

int main()
{
	scanf("%d",&t);
	while(t--)
	    {
	    scanf("%d",&n);
	    printf("%d\n",4*n%mod*power(5,n-1,mod)%mod);
	    }
	return 0;
}

递推问题

错排问题

给一个数 n n n,求有多少 1 ∼ n 1\sim n 1n 的排列 A A A 满足对于每个 i i i ,都满足 A i ≠ i A_i\ne i Ai=i

例如当 n = 3 n=3 n=3 时,满足要求的排列只有 2 , 3 , 1 2,3,1 2,3,1 3 , 1 , 2 3,1,2 3,1,2

a , b , c , d … a,b,c,d\dots a,b,c,d 表示 n n n 个数字, A , B , C , D … A,B,C,D\dots A,B,C,D 表示 n n n 个位置( a a a 对应 A A A), 错装的方法总数为记作 f n f_n fn

假设把 a a a 错装进 B B B 中, 然后接下来我们可以分为两种情况:

1 1 1 b b b 错装进了 A A A

那么问题就变为 c , d … c,d\dots c,d 个数字(共 n − 2 n-2 n2 个)放入 C , D … C,D\dots C,D n − 2 n-2 n2 个位置时完全装错。由定义得有 f n − 2 f_{n-2} fn2 种。

2 2 2 b b b 错装进了除 A A A 之外的一个位置

由于题设中 b b b 不能放入 A A A ,我们可以把 A A A 想象成 B B B ,就相当于将 b , c , d … b,c,d\dots b,c,d n − 1 n-1 n1 个数字放入 B , C , D … B,C,D\dots B,C,D n n n 个位置时完全放错。由定义得有 f n − 1 f_{n-1} fn1 种。

a a a 错装进 B B B 中,有 f n − 1 + f n − 2 f_{n-1}+f_{n-2} fn1+fn2 种, 同样 a a a 错装进 C C C 中也有 f n − 1 + f n − 2 f_{n-1}+f_{n-2} fn1+fn2 … \dots 所以根据加法原理,求出 f f f 的递推式为:

f n = ( n − 1 ) ( f n − 1 + f n − 2 ) f_n=(n-1)(f_{n-1}+f_{n-2}) fn=(n1)(fn1+fn2)

例题 8 8 8

P4071 [SDOI2016]排列计数

由于序列恰好有 m m m 个位置,使得 a i = i a_i = i ai=i,所以剩下的 n − m n-m nm 个位置满足 a i ≠ i a_i \ne i ai=i ,就是上文所述的 f n − m f_{n-m} fnm ,直接线性递推即可。

使得 a i = i a_i = i ai=i m m m 个位置,本身就有 C n m C_{n}^m Cnm 种选法。根据乘法原理,得到答案为:

C n m f n − m C_n^mf_{n-m} Cnmfnm

注意需要求逆元以及预处理做到 O ( 1 ) O(1) O(1) 回答询问。

#include <bits/stdc++.h>
using namespace std;
long long t,m,n,cuo[1000020],jc[1000020],inv[1000020],mod=1000000007;
long long power(long long a,long long p,long long m)
{
	long long ans=1,x=a;
	while(p)
	    {
	    	if(p%2==1)ans=ans*x%m;
	    	p/=2;
	    	x=x*x%m;
		}
	return ans;
}

int main()
{
	cuo[0]=1;cuo[2]=1;jc[0]=1;jc[1]=1;inv[0]=1;inv[1]=1;
	for(int i=2;i<=1000010;i++)jc[i]=jc[i-1]*i%mod;
	for(int i=2;i<=1000010;i++)inv[i]=power(jc[i],mod-2,mod)%mod;
	for(int i=3;i<=1000010;i++)cuo[i]=(i-1)*(cuo[i-1]+cuo[i-2])%mod;
	scanf("%lld",&t);
	for(int i=1;i<=t;i++)
	    {
	    	scanf("%lld%lld",&n,&m);
	    	if(n<m)
	    	   {
			   printf("0\n");
			   continue;
		       }
	    	printf("%lld\n",jc[n]*inv[n-m]%mod*inv[m]%mod*cuo[n-m]%mod);
		}
	return 0;
}

第二类Stirling数

n n n 个有区别的球放到 m m m 个相同的盒子中,要求无一空盒,其不同的方案数用 S 2 n , m S2_{n,m} S2n,m 表示,称为第二类Stirling数

设有 n n n 个不同的球,分别用 b 1 , b 2 , … b n b_1,b_2,\dots b_n b1,b2,bn 表示。 从中取出一个球 b n b_n bn b n b_n bn的放法有以下两种:

1 1 1 b n b_n bn 独自占一个盒子

那么剩下的球只能放在 m − 1 m-1 m1 个盒子中,方案数为 S 2 n − 1 , m − 1 S2_{n-1,m-1} S2n1,m1

2 2 2 b n b_n bn 与别的球共占一个盒子

那么可以事先将 b 1 , b 2 , … b n − 1 b_1,b_2,\dots b_{n-1} b1,b2,bn1 n − 1 n-1 n1 个球放入 m m m 个盒子中,然后再将球 b n bn bn 可以放入其中一个盒子中,方案数为 m S 2 n − 1 , m mS2_{n-1,m} mS2n1,m

根据加法原理,得出第二类Stirling数的递推式:

S 2 n , m = S 2 n − 1 , m − 1 + m S 2 n − 1 , m S2_{n,m}=S2_{n-1,m-1}+mS2_{n-1,m} S2n,m=S2n1,m1+mS2n1,m

例题 9 9 9

P1655 小朋友的球

第二类Stirling数板子题,注意需要高精度。

#include <bits/stdc++.h>
using namespace std;
int n,m;
int f[101][101][101]; 
void huge_int(int na,int nb,int a,int b,int c,int d,int m)
{
	int flag=0;
	for(int i=1;i<=100;i++)
	    f[na][nb][i]=f[a][b][i];
	for(int i=100;i>0;i--)
	    {
	    	f[na][nb][i]+=f[c][d][i]*m+flag;
	    	flag=f[na][nb][i]/10;
	    	f[na][nb][i]%=10;
		}
}

void print(int n,int m)
{
	int now=1;
	for(now=1;now<=100;now++)
	    if(f[n][m][now]!=0)break;
	for(int i=now;i<=100;i++)
	    printf("%d",f[n][m][i]);
}

int main()
{
	for(int i=1;i<=100;i++)f[i][1][100]=f[i][i][100]=1;
	for(int i=1;i<=100;i++)
	    for(int j=1;j<=100;j++)
	        if(!(i==j||j==1))huge_int(i,j,i-1,j-1,i-1,j,j);
	while(scanf("%d%d",&n,&m)!=-1)
	     {
	     if(n<m)
	        {
	        	printf("0\n");
	        	continue;
			}
	     print(n,m);
	     putchar('\n');
	     }
	return 0;
}

后记

教练推荐的几篇博客:

lucas定理

不容易系列之(4)——考新郎

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

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

相关文章

SpringBoot 第二课(Ⅰ) 整合springmvc(详解)

目录 一、SpringBoot对静态资源的映射规则 1. WebJars 资源访问 2. 静态资源访问 3. 欢迎页配置 二、SpringBoot整合springmvc 概述 Spring MVC组件的自动配置 中央转发器&#xff08;DispatcherServlet&#xff09; 控制器&#xff08;Controller&#xff09; 视图解…

OpenHarmony 开源鸿蒙北向开发——3.配置SDK

安装、配置完成之后我们就要配置SDK。 我们创建工程后&#xff0c;点击右上角设置 进入设置 进入OpenHarmony SDK&#xff0c;选择编辑 这里配置一下SDK安装位置 点击完成 这里我们API版本勾选第一个即可 确认安装 勾选接受 这里要等一会 安装完成后&#xff0c;点击完成

vulhub Matrix-Breakout

1.下载靶机&#xff0c;打开靶机和kali虚拟机 2.查询kali和靶机ip 3.浏览器访问 访问81端口有登陆界面 4.扫描敏感目录 kali dirb 扫描 一一访问 robot.txt提示我们继续找找&#xff0c;可能是因为我们的字典太小了&#xff0c;我们换个扫描器换个字典试下,利用kali自带的最大…

Unity3D开发AI桌面精灵/宠物系列 【二】 语音唤醒 ivw 的两种方式-Windows本地或第三方讯飞等

Unity3D 交互式AI桌面宠物开发系列【二】ivw 语音唤醒 该系列主要介绍怎么制作AI桌面宠物的流程&#xff0c;我会从项目开始创建初期到最终可以和AI宠物进行交互为止&#xff0c;项目已经开发完成&#xff0c;我会仔细梳理一下流程&#xff0c;分步讲解。 这篇文章主要讲有关于…

三月九次前端面试复盘:当场景题成为通关密钥

三月初集中面了包括字节、美团、滴滴在内的9家公司&#xff0c;经历7场技术面2场Leader面后&#xff0c;发现如今的面试逻辑已发生根本转变。这里分享真实经历与题目&#xff0c;供近期求职者参考。 一、面试形态变化&#xff1a;从理论背诵到实战推演 1. 八股文边缘化&#…

C++输入输出流第一弹:标准输入输出流 详解(带测试代码)

目录 C输入输出流 流的四种状态&#xff08;重点&#xff09; 标准输入输出流 标准输入流 逗号表达式 1. 逗号表达式的基本规则 示例 2. 图片中的代码分析 关键点解析 3. 常见误区 误区 1&#xff1a;逗号表达式等同于逻辑与 && 误区 2&#xff1a;忽略输入…

鸿蒙NEXT项目实战-百得知识库05

代码仓地址&#xff0c;大家记得点个star IbestKnowTeach: 百得知识库基于鸿蒙NEXT稳定版实现的一款企业级开发项目案例。 本案例涉及到多个鸿蒙相关技术知识点&#xff1a; 1、布局 2、配置文件 3、组件的封装和使用 4、路由的使用 5、请求响应拦截器的封装 6、位置服务 7、三…

黑马node.js教程(nodejs教程)——AJAX-Day01-04.案例_地区查询——查询某个省某个城市所有地区(代码示例)

文章目录 代码示例效果 代码示例 axiosTest.html <!DOCTYPE html> <!-- 文档类型声明&#xff0c;告诉浏览器这是一个HTML5文档 --> <html lang"en"> <!-- HTML根元素&#xff0c;设置文档语言为英语 --><head> <!-- 头部区域&am…

vue 自制列表,循环滚动

需求人员表示&#xff0c;超过高度的表格内容需要滚动展示&#xff0c;所以效果图如下&#xff1a; 自定义列表样式&#xff0c;主要是通过flex布局&#xff0c;控制 类th 与 类td 的宽度保持一致&#xff0c;标签结构还是参考了table的结构&#xff0c;由thead与tbody包裹tr再…

Windows主机、虚拟机Ubuntu、开发板,三者之间文件互传

以下内容源于日常学习的整理&#xff0c;欢迎交流。 下图是Windows主机、虚拟机Ubuntu、开发者三者之间文件互传的方式示意图&#xff1a; 注意&#xff0c;下面谈及的所有方式&#xff0c;都要求两者的IP地址处于同一网段&#xff0c;涉及到的软件资源见felm。 一、Windows主…

Windows Docker 报错: has no HTTPS proxy,换源

pull python 3.7报错&#xff1a; 尝试拉取Docker 测试库hello world也失败 尝试使用临时镜像源&#xff0c;可以成功拉取&#xff1a; sudo docker pull docker.m.daocloud.io/hello-world说明确实是网络问题&#xff0c;需要配置镜像源&#xff0c;为了方便&#xff0c;在d…

Java:Arrays类:操作数组的工具类

文章目录 Arrays类常见方法SetAll(); 代码排序如果数组中存储的是自定义对象 Arrays类 常见方法 SetAll(); 注意&#xff1a; 不能用新的数组接是因为修改的是原数组&#xff0c;所以完了要输出原数组发现会产生变化参数是数组下标变成灰色是因为还能简化&#xff08;Lambda…

只是“更轻更薄”?不!遨游三防平板还选择“更强更韧”

当消费电子领域普遍追求“更轻更薄”的设计美学时&#xff0c;遨游三防平板不止于此&#xff0c;还选择了另一条道路——“更强更韧”。在智能制造的复杂场景中&#xff0c;三防平板需直面高温、油污、撞击与极端气候的考验。普通消费级平板因防护性能不足&#xff0c;常因环境…

基于RAGFlow本地部署DeepSeek-R1大模型与知识库:从配置到应用的全流程解析

作者&#xff1a;后端小肥肠 &#x1f34a; 有疑问可私信或评论区联系我。 &#x1f951; 创作不易未经允许严禁转载。 姊妹篇&#xff1a; DeepSpeek服务器繁忙&#xff1f;这几种替代方案帮你流畅使用&#xff01;&#xff08;附本地部署教程&#xff09;-CSDN博客 10分钟上手…

[蓝桥杯 2023 省 B] 飞机降落(不会dfs的看过来)

[蓝桥杯 2023 省 B] 飞机降落 题目描述 N N N 架飞机准备降落到某个只有一条跑道的机场。其中第 i i i 架飞机在 T i T_{i} Ti​ 时刻到达机场上空&#xff0c;到达时它的剩余油料还可以继续盘旋 D i D_{i} Di​ 个单位时间&#xff0c;即它最早可以于 T i T_{i} Ti​ 时刻…

信创系统极速文件查找:locate 命令详解

原文链接&#xff1a;信创系统极速文件查找&#xff1a;locate 命令详解 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇信创终端操作系统上 locate 命令详解的文章。在 Linux 及信创终端操作系统&#xff08;如 统信 UOS、麒麟 KOS&#xff09;中&#xff0c;查找…

C# | 超简单CSV表格读写操作(轻松将数据保存到CSV,并支持读取还原)

C# | 超简单CSV表格读写操作&#xff08;轻松将数据保存到CSV&#xff0c;并支持读取还原&#xff09; 文章目录 C# | 超简单CSV表格读写操作&#xff08;轻松将数据保存到CSV&#xff0c;并支持读取还原&#xff09;一、上位机开发中的CSV应用背景二、CSV读写实战教学1. 基本对…

PostgreSQL:语言基础与数据库操作

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

蓝桥杯学习——二叉树+奇点杯题目解析

基础认知 一、二叉树种类&#xff1a; 1.满二叉树。记深度k&#xff0c;节点数量2^k-1。 2.完全二叉树&#xff1a;除了底层&#xff0c;其余全满&#xff0c;底部从左到右连续。 3&#xff0c;平衡二叉搜索树&#xff1a;左子树和右子树高度差不大于1。 二、存储方式&…

基于django+vue的购物商城系统

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.8数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 系统首页 热卖商品 优惠资讯 个人中心 后台登录 管理员功能界面 用户管理 商品分类管理…