【6】组合计数学习笔记
前言
关于今天发现自己连快速幂都忘记怎么写这件事
这篇博客是组合计数基础,由于大部分内容都是 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=m1m2…mn
加法原理步骤相互独立,任何一种都能独立完成这件事;乘法原理步骤缺一不可,缺少任意一种就不能完成这件事。
排列与组合
排列:从 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(n−1)(n−2)…(n−m+1)=(n−m)!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(n−1)(n−2)…(n−m+1)=m!(n−m)!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=Cnn−m
原因:从 n n n 个不同元素中取出 m m m 个元素,也就是从 n n n 个不同元素中不选择 n − m n-m n−m 个元素,方法数一样。
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=Cm−1n−1+Cm−1n
原因:从 n n n 个不同元素中取出 m m m 个元素,如果其中一个元素不取,那么就变成了从 n − 1 n-1 n−1 个不同元素中取出 m m m 个元素;如果其中一个元素取,那么就变成了从 n − 1 n-1 n−1 个不同元素中取出 m − 1 m-1 m−1 个元素。再根据加法原理,得出这条性质。
组合数的求法
求法 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!(n−m)!n!=n!×inv(m!)×inv[(n−m)!]
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=0∑nCnkakbn−k
那么可以推出:
( 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=0∑nCnk(ax)k(by)n−k=k=0∑n(Cnkakbn−k)xkyn−k
二项式定理可以通过数学归纳法证明,但因为个人实力有限 (教练没讲),就不证明了。
例题 3 3 3 :
P1313 [NOIP2011 提高组] 计算系数
用杨辉三角递推求出组合数,直接套用二项式定理计算系数,用快速幂处理 a k b n − k a^kb^{n-k} akbn−k 即可。
#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 x→b→c⋯→y,每次增加相邻两个点,这样除了 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} (r−l+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} bnm−i 种选法。
∑ 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,2∣i∑nmCnmiaibnm−i
看到这个式子,容易联想到二项式定理。但是这个式子不好转化,需要转化为对于每一个 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(r−l+1)nm−∑i=0nm(−1)iCnmiaibnm−i
直接利用二项式定理进行转化,达到复杂度 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(r−l+1)nm−(b−a)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) Cnm≡C⌊n/p⌋⌊m/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) Cnm≡C⌊n/p⌋⌊m/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} C⌊n/p⌋⌊m/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 1∼n 的排列 A A A ,由 1 , 2 … n 1,2\dots n 1,2…n 这 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 m−1 种选择。根据乘法原理,总共有 m ( m − 1 ) n − 1 m(m-1)^{n-1} m(m−1)n−1 种排列方式。
用总共的数量减去不满足的数量,就能得到答案 S S S 了:
S = m n − m ( m − 1 ) n − 1 S=m^n-m(m-1)^{n-1} S=mn−m(m−1)n−1
注意减法取模要先加上模数。
#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 n−1 个五边形拆掉哪条边没有限制,每个有 5 5 5 种拆法,根据乘法原理,共有 5 n − 1 5^{n-1} 5n−1 种。
最后根据乘法原理,得到答案 S S S 为:
S = 5 n − 1 4 n S=5^{n-1}4n S=5n−14n
#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 1∼n 的排列 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 n−2 个)放入 C , D … C,D\dots C,D… 这 n − 2 n-2 n−2 个位置时完全装错。由定义得有 f n − 2 f_{n-2} fn−2 种。
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 n−1 个数字放入 B , C , D … B,C,D\dots B,C,D… 这 n n n 个位置时完全放错。由定义得有 f n − 1 f_{n-1} fn−1 种。
a a a 错装进 B B B 中,有 f n − 1 + f n − 2 f_{n-1}+f_{n-2} fn−1+fn−2 种, 同样 a a a 错装进 C C C 中也有 f n − 1 + f n − 2 f_{n-1}+f_{n-2} fn−1+fn−2 种 … \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=(n−1)(fn−1+fn−2)
例题 8 8 8 :
P4071 [SDOI2016]排列计数
由于序列恰好有 m m m 个位置,使得 a i = i a_i = i ai=i,所以剩下的 n − m n-m n−m 个位置满足 a i ≠ i a_i \ne i ai=i ,就是上文所述的 f n − m f_{n-m} fn−m ,直接线性递推即可。
使得 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} Cnmfn−m
注意需要求逆元以及预处理做到 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 m−1 个盒子中,方案数为 S 2 n − 1 , m − 1 S2_{n-1,m-1} S2n−1,m−1 。
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,…bn−1 这 n − 1 n-1 n−1 个球放入 m m m 个盒子中,然后再将球 b n bn bn 可以放入其中一个盒子中,方案数为 m S 2 n − 1 , m mS2_{n-1,m} mS2n−1,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=S2n−1,m−1+mS2n−1,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)——考新郎
相关文章:
【6】组合计数学习笔记
前言 关于今天发现自己连快速幂都忘记怎么写这件事 这篇博客是组合计数基础,由于大部分内容都是 6 6 6 级,所以我就给整个提高级的组合数学评了 6 6 6 级。 组合计数基础 加法原理与乘法原理 加法原理(分类计数原理)&#…...
功能安全实战系列06-英飞凌Tricore系列SMU详解
本文框架 前言1.What?1.1SMU特性及架构1.1.1 SMU_core和SMU_stdby1.1.2 Flip-Flop机制1.1.3 RT Alarm (RecoveryTime)1.2 Alarm状态机1.3 FSP1.4 Alarm handing1.4.1 SMU_core Alarm handing1.4.2 SMU_Standby Alarm handing1.5 寄存器介绍2.How?2.1 如何排查SMU问题前言 在…...
Python 中的集合的中高级用法
Python 中的集合(set)是一种无序且不重复的数据结构,适用于去重、成员检测和集合运算等场景。以下是集合的中级和高级用法,涵盖从基础到高级的详细操作。 1. 集合的创建与初始化 1.1 创建集合 # 空集合 empty_set = set()# 直接初始化 my_set = {1, 2,...
opencv初步学习——图像处理2
这一部分主要讲解如何初步地创建一个图像,以及彩色图像我们的一些基本处理方法 一、创建一个灰度图像 1-1、zeros()函数 [NumPy库] 要用到这一个函数,首先我们需要调用我们的NumPy库,这一个函数的作用是可以帮助我们生成一个元素值都是0的二…...
传统服务部署、虚拟化部署与云原生部署资源消耗对比与优化指南
1. 三种部署方式概述 1.1 传统服务部署 定义:直接运行于物理服务器或基础Linux操作系统环境,无虚拟化层隔离 特点: 资源独占(CPU/内存/磁盘) 部署流程简单但扩展困难 典型场景:单一业务高负载场景&…...
使用htool工具导出和导入Excel表
htool官网 代码中用到的hool包里面的excel工具ExcelUtil 1. 引入依赖 <!-- Java的工具类 --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.25</version></dependency>&l…...
【Linux内核】从文件层面理解socket建立的方式(优雅的C风格多态)
内核层面理解 Socket 的创建和连接 引言 众所周知,Linux 下一切皆文件。无论是普通文件(如 file.txt),还是特殊文件(包括网络套接字),我们都可以以处理文件的方式来访问它们。网络套接字&…...
WebSocket:开启实时通信的新篇章
在当今的互联网应用中,实时交互已经成为不可或缺的一部分。无论是实时的在线聊天、股票行情更新,还是多人在线游戏,都需要一种高效的双向通信机制。而这正是 WebSocket 的用武之地。 本文将带你深入了解 WebSocket,探索其工作原理…...
只是“更轻更薄”?不!遨游三防平板还选择“更强更韧”
当消费电子领域普遍追求“更轻更薄”的设计美学时,遨游三防平板不止于此,还选择了另一条道路——“更强更韧”。在智能制造的复杂场景中,三防平板需直面高温、油污、撞击与极端气候的考验。普通消费级平板因防护性能不足,常因环境…...
C++ 各种map对比
文章目录 特点比较1. std::map2. std::unordered_map3. std::multimap4. std::unordered_multimap5. hash_map(SGI STL 扩展) C 示例代码代码解释 特点比较 1. std::map 底层实现:基于红黑树(一种自平衡的二叉搜索树)…...
《量子门与AI神经元:计算世界的奇妙碰撞》
在当今科技飞速发展的时代,量子计算和人工智能作为前沿领域,正不断颠覆我们对计算和智能的认知。量子门操作和AI中的神经元计算过程,分别作为这两大领域的核心机制,看似处于不同维度,却有着千丝万缕的联系,…...
【Linux———生产消费模型】
并不是真的路过而已,也不是真的不会想你.............................................................................. 文章目录 前言 一、【生产者消费者模型的介绍】 1、【概念引入】 2、【特点—321原则】 3、【优点】 二、【基于阻塞队列的生产者消费…...
876.链表的中间节点
题目 Python # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:slow fa…...
蓝桥杯第13届真题2
由硬件框图可以知道我们要配置LED 和按键 一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码&a…...
【微信小程序变通实现DeepSeek支持语音】
微信小程序实现录音转文字,并调用后端服务(Node.js)进行语音识别和,然后调用DeepSeek 处理的完整实现。 整体架构 前端(微信小程序): 实现录音功能。将录音文件上传到后端。接收后端返回的语音…...
XSS 绕过分析:一次循环与两次循环的区别
目录 代码分析 代码流程: 一次循环的问题 原因分析:删除顺序导致遗漏 两次循环修复方案 两种绕过方式 绕过方法 1:DOM破环 绕过方法 2:SVG XSS(双 SVG 绕过) 1. 为什么 "一个SVG注定失败&…...
AI重构工程设计、施工、总承包行业:从智能优化到数字孪生的产业革命
摘要 AI正深度重构工程设计、施工与总承包行业,推动从传统经验驱动向数据智能驱动的转型。本文系统性解析AI当前在智能优化设计、施工过程管理、全生命周期数字孪生等场景的应用,展望未来AI在自动化决策、跨域协同等领域的潜力,并从投入产出…...
全局上下文网络GCNet:创新架构提升视觉识别性能
摘要:本文介绍了全局上下文网络(GCNet),通过深入分析非局部网络(NLNet),发现其在重要视觉识别任务中学习的全局上下文与查询位置无关。基于此,提出简化的非局部模块、全局上下文建模…...
MySQL 调优
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
ASP3605抗辐照加固同步降压调节器——商业航天电源芯片解决方案新选择
ASP3605企业宇航级型号ASP3605S2U通过SEU≥75 MeVcm/mg与SEL≥75 MeVcm/mg抗辐射测试。其输入电压4V至15V,输出电流5A,支持多相级联与冗余设计,适用于卫星、航天器电源系统。 面向航天场景的核心功能设计 1. 抗辐射与可靠性保障 单粒子效应…...
C#的List和DIctionary实现原理(手搓泛型类以及增删查改等功能)
这里写自定义目录标题 ListDIctionary List MyList类:这是一个泛型类,能够存储任意类型的元素。 _items数组:用于实际存储元素。 _size变量:记录当前列表中的元素数量。 构造函数:初始化数组容量为 4。 Count属性&…...
设计模式-对象创建
对象创建 前言1. Factory Method1.1 模式介绍1.2 模式代码1.2.1 问题代码1.2.2 重构代码 1.3 模式类图1.4 要点总结 2. Abstract Factory2.1 模式介绍2.2 模式代码2.2.1 问题代码2.2.2 重构代码 2.3 模式类图2.4 要点总结 3. Prototype3.1 模式介绍3.2 模式代码3.3 模式类图3.4…...
Linux进程虚拟内存空间的管理
5、 进程虚拟内存空间的管理 主要逻辑 重点函数 task_struct函数(进程在内核中的描述符函数) 进程在内核中的描述符task_struct结构: struct task_struct{ //进程的描述符//进程idpid_t pid;//用于标识线程所属的进程pid_t tgi…...
git tag常用操作
git tag是干嘛用的,相当于一个轻量级的分支。在一个分支上,创建一个tag,就是标记某一次的提交。然后方便checkout到 这个标签上。用tag的意思就是不用专门再创建一个新分支来修改后续的改动。分支不变,继续在上面改动,…...
VIVO手机如何实现证件照换底色?证件照换底色技巧分享
在日常生活中,我们常常需要使用不同底色的证件照,无论是办理证件、提交资料还是其他用途,一张符合要求的证件照都显得尤为重要。 而VIVO手机凭借其强大的拍照功能和便捷的图片编辑工具,为我们提供了一种简单高效的证件照换底色解…...
函数闭包的学习
作用:可以保存外部函数的变量 形成条件: 1 函数嵌套 2 内部函数用了外部函数的变量或者参数 3 外部函数返回了内部函数(是返函数名,不带括号) 这个使用了外部函数变量的内部函数称为闭包。 口诀:函数嵌…...
解码软件需求的三个维度:从满足基础到创造惊喜
在软件开发的世界里,用户需求就像一张复杂的地图,指引着产品前进的方向。但并非所有需求都能带来同样的价值——有些是产品生存的“氧气”,有些是吸引用户的“磁石”,还有一些则是让人眼前一亮的“魔法”。如何区分它们࿱…...
网页制作代码html制作一个网页模板
制作一个简单而实用的网页模板:HTML基础入门 在数字时代,网页已成为信息展示和交流的重要平台。HTML(HyperText Markup Language)作为网页制作的基础语言,为开发者提供了构建网页的基本框架。本文将带你了解如何使用H…...
股票量化交易开发 Yfinance
以下是一段基于Python的股票量化分析代码,包含数据获取、技术指标计算、策略回测和可视化功能: python import yfinance as yfimport pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as snsfrom backtesting import Bac…...
从 Snowflake 到 Databend Cloud:全球游戏平台借助 Databend 实现实时数据处理
导读:某全球游戏平台为全球数百万玩家提供实时的技能型游戏体验与无缝的实时互动。对该游戏平台而言,保持数据的实时更新和实时分析,对提升玩家互动和留存率至关重要。他们在使用 Snowflake 进行实时数据摄取和分析时遇到了重大挑战ÿ…...
工作记录 2017-02-08
工作记录 2017-02-08 序号 工作 相关人员 1 修改邮件上的问题。 更新RD服务器。 郝 更新的问题 1、CPT的录入页面做修改 1.1、Total 改为 Price 1.2、当删除行时,下面的行自动上移。 2、Pending Payments、Payment Posted、All A/R Accounts页面加了CoIns…...
【RabbitMQ】RabbitMQ的基本架构是什么?包括哪些核心组件?
RabbitMQ基于AMQP协议实现,由多个核心组件组成,确保消息的可靠传递。 Rabbit的架构图: 1.RabbitMQ的基本架构: 1.核心组件: 1.Producer(生产者): 发送消息到RabbitMQ。 2.Exchange(交换机):接…...
Quartz知识点总结
简单说明 简单的定时任务使用Timer或者ScheduledExecutorService quartz支持复杂的定时执行功能。支持ram存储(内存存储)和持久化存储。quartz有分布式和集群能力 简单使用 获取任务调度器Schedule。任务调度器可以管理任务。创建任务实例。使用JobB…...
P2786 英语1(eng1)- 英语作文
P2786 英语1(eng1)- 英语作文 题目背景 蒟蒻 HansBug 在英语考场上,挠了无数次的头,可脑子里还是一片空白。 题目描述 眼下出现在 HansBug 蒟蒻面前的是一篇英语作文,然而智商捉急的 HansBug 已经草草写完了&#…...
Clion远程开发配置
代码开发环境:windows下,基于Clion 2024.3开发,标准为C20 代码运行环境:远程服务器,ubuntu,cmake版本3.12,gcc11.4,g11.4,gdb12.1 实现功能:在本地windows开…...
Javascript基础
目录 1. 变量声明2. 基本数据类型3.复杂数据类型4.字符串方法5.对象方法6.时间方法7.条件(if)8.循环(for/while)9.遍历(for in/of)10.多选(Switch)END 1. 变量声明 const࿱…...
蓝桥杯2023年第十四届省赛真题-阶乘的和
蓝桥杯2023年第十四届省赛真题-阶乘的和 时间限制: 2s 内存限制: 320MB 提交: 3519 解决: 697 题目描述 给定 n 个数 Ai,问能满足 m! 为∑ni1(Ai!) 的因数的最大的 m 是多少。其中 m! 表示 m 的阶乘,即 1 2 3 m。 输入格式 输入的第一行包含一个整…...
供应链优化售前方案建议书V23(58页PPT)(文末有下载方式)
随着家电行业的快速发展,供应链管理已成为企业竞争的关键要素。杭州松下电器在面对日益复杂的市场环境和激烈的市场竞争时,急需对其供应链进行优化。本文将对杭州松下电器的供应链优化方案进行详细解读,探讨其优化策略及其潜在价值。 供应链…...
校园论坛系统Selenium自动化测试
本文为自动化测试 本项目自动化测试代码链接(仅供参考): 自动化测试代码 功能测试文章链接: 校园论坛系统自动化测试报告-CSDN博客 🌈自动化测试 思维导图 根据思维导图, 我们选取几个主要的功能进行自动化测试 编写代码 思路: 根据脑图进行测试用例的编写&am…...
Linux 一步部署DHCP服务
#!/bin/bash #脚本作者和日期 #author: PEI #date: 20250319 #检查root权限 if [ "$USER" ! "root" ]; then echo "错误:非root用户,权限不足!" exit 0 fi #防火墙与高级权限 systemctl stop firewa…...
Cool Request:可以统计任意方法耗时
什么是Cool Request Cool Request是一个IDEA中的接口调试插件,除了可以发起基本的HTTP请求之外,还提供了强大的反射调用能力,可以绕过拦截器,这点广受网友的好评,当然伴随着还有Spring中对Scheduled注解的调用&#x…...
基于Spring Boot的图书管理系统的设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
Python实战(2)-数据库支持
使用简单的纯文本文件可实现的功能有限。诚然,使用它们可做很多事情,但有时可能还需要额外的功能。你可能希望能够自动完成序列化,此时可求助于shelve和pickle(类似于shelve)。不过你可能需要比这更强大的功能。例如…...
【工具】isolateR桑格测序数据的自动化处理、分类分析以及微生物菌株库的生成R包
文章目录 介绍代码案例Step 1: isoQC - Automated quality trimming of sequencesStep 2: isoTAX - Assign taxonomyStep 3: isoLIB - Generate strain library 参考 介绍 对分类标记基因(如16S/18S/ITS/rpoB/cpn60)进行桑格测序是鉴定包括细菌、古菌和…...
比特币牛市还在不在
在加密货币的风云世界里,比特币的一举一动始终牵动着投资者们的神经。近期比特币的涨幅动作,再次引发了市场对于牛市是否仍在延续的激烈讨论。 在深入探索比特币市场的过程中,获取全面且及时的资讯至关重要。您可以通过访问Techub News&#…...
鸿蒙下载文件保存到手机本地公共文件夹下、将本地的沙箱目录文件,保存到公共目录,鸿蒙picker save保存文件为空(0字节)的问题
1、首先将下载好的文件,保存到本地目录,这个目录是用户看不到的; 2、然后通过picker的save保存文件,这个picker,它只是获取公共目录uri用的 3、当picker有回调时,将公共目录的uri获取之后,把下…...
红日靶场(二)——个人笔记
靶场搭建 新增VMnet2网卡 **web:**需要配置两张网卡,分别是外网出访NAT模式和内网域环境仅主机模式下的VMnet2网卡。 **PC:**跟web一样,也是需要配置两张网卡,分别是外网出访NAT模式和内网域环境仅主机模式下的VMn…...
口袋书签功能上新,免费使用
丰富主页面的菜单,操作更加便捷。 快来构建你的门户站点吧。 戳: 口袋书签...
Model Context Protocol - Prompts
1. 概述 Model Context Protocol (MCP) 提供了一种标准化的方式,使服务器能够向客户端暴露提示模板(prompts)。Prompts 是服务器提供的结构化消息和指令,用于与语言模型进行交互。客户端可以发现可用的提示、获取其内容ÿ…...
零知识证明:区块链隐私保护的变革力量
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...