当前位置: 首页 > news >正文

数据结构与算法学习笔记----求组合数

数据结构与算法学习笔记----求组合数

@@ author: 明月清了个风
@@ first publish time: 2025.1.27

ps⭐️一组求组合数的模版题,因为数据范围的不同要用不同的方法进行求解,涉及了很多之前的东西快速幂,逆元,质数,高精度等等,还有新的定理——lucas定理,卡特兰数

Acwing 885. 求组合数 I

[原题链接](885. 求组合数 I - AcWing题库)

给定 n n n组询问,每组询问给定两个整数 a a a b b b,请你输出 C a b m o d ( 1 0 9 + 7 ) C_{a}^{b} \bmod (10^9 + 7) Cabmod(109+7)的值。

输入格式

第一行包含整数 n n n

接下来 n n n行,每行包含一组 a a a b b b

输出格式

n n n行,每行输出一个询问的解。

数据范围

1 ≤ n ≤ 10000 1 \le n \le 10000 1n10000

1 ≤ b ≤ a ≤ 2000 1 \le b \le a \le 2000 1ba2000

思路

首先我需要知道组合数的基本计算方法,如有一组合数 C a b C_{a}^{b} Cab,那么其计算如下:
C a b = a ! b ! ( a − b ) ! (1) C_{a}^{b} = \frac{a!}{b!(a - b)!} \tag{1} Cab=b!(ab)!a!(1)
这里引入组合数的一个公式如下:
C a b = C a − 1 b + C a − 1 b − 1 (2) C_{a}^{b} = C_{a - 1}^{b} + C_{a - 1}^{b - 1} \tag{2} Cab=Ca1b+Ca1b1(2)
我们可以这样理解这个公式:假设我们是要在 a a a个苹果中选取 b b b个苹果,即 C a b C_{a}^{b} Cab。那么对于某一个苹果而言,只可能有两种情况——被选取和不被选取,这两种情况包含了我们要求的目标的所有方案。当这个苹果被选取了,那么这样的方案数就是 C a − 1 b − 1 C_{a - 1}^{b - 1} Ca1b1,即在剩下的 a − 1 a - 1 a1个苹果中再选取 b − 1 b - 1 b1个;当这个苹果没有被选取,其对应方案数就是 C a − 1 b C_{a - 1}^{b} Ca1b,也就是在剩下的 a − 1 a - 1 a1个苹果中仍需要选取 b b b个。

这样就意味着我们的目标是可以通过之前的组合数计算出来的,也就是可以进行递推,而不用每次都重新计算,时间复杂度也就降低了。

代码

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>using namespace std;const int N = 2010, mod = 1e9 + 7;int c[N][N];void init()
{for(int i = 0; i < N; i ++)for(int j = 0; j <= i; j ++)if(!j) c[i][j] = 1;else c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % mod;
}int main()
{init();int n;cin >> n;while(n --){int a, b;cin >> a >> b;cout << c[a][b] << endl;}return 0;
}

Acwing 886. 求组合数 II

[原题链接](886. 求组合数 II - AcWing题库)

给定 n n n组询问,每组询问给定两个整数 a a a b b b,请你输出 C a b m o d ( 1 0 9 + 7 ) C_{a}^{b} \bmod (10^9 + 7) Cabmod(109+7)的值。

输入格式

第一行包含整数 n n n

接下来 n n n行,每行包含一组 a a a b b b

输出格式

n n n行,每行输出一个询问的解。

数据范围

1 ≤ n ≤ 10000 1 \le n \le 10000 1n10000

1 ≤ b ≤ a ≤ 1 0 5 1 \le b \le a \le 10^5 1ba105

思路

注意这题的数据范围 a , b a,b a,b都到了 1 0 5 10^5 105,如果还用上面的预处理两重循环会直接超时,这里我们直接从组合数的计算公式出发看我们要计算的是什么
C a b m o d ( 1 0 9 + 7 ) = a ! b ! ( a − b ) ! m o d ( 1 0 9 + 7 ) (1) C_{a}^{b} \bmod (10^9 + 7) = \frac{a!}{b!(a - b)!} \bmod (10^9 + 7) \tag{1} Cabmod(109+7)=b!(ab)!a!mod(109+7)(1)
这样其实就是我们熟悉的内容了,对于阶乘而言我们可以进行预处理,唯一需要注意的就是除法模运算的处理,我们可以使用之前学过的逆元将其转换为一个乘法模运算,需要做的是预处理出分母阶乘的逆元。

逆元用之前的快速幂模版即可求得,具体的看一下快速幂那一篇。

代码

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>using namespace std;typedef long long LL;const int N = 100010, mod = 1e9 + 7;int n;
int fact[N], infact[N];int qmi(int a, int k, int p)
{int res = 1;while(k){if(k & 1) res = (LL)res * a % p;k >>= 1;a = (LL)a * a % p;}return res;
}int main()
{cin >> n;fact[0] = infact[0] = 1;for(int i =1; i < N; i++){fact[i] = (LL)fact[i - 1] * i % mod;infact[i] = (LL)infact[i - 1] * qmi(i, mod - 2, mod) % mod;}while(n --){int a, b;cin >> a >> b;cout << (LL)fact[a]  * infact[a - b] % mod * infact[b] % mod << endl;}return 0;}

Acwing 887. 求组合数 III

[原题链接](887. 求组合数 III - AcWing题库)

给定 n n n组询问,每组询问给定两个整数 a a a b b b p p p,其中 p p p是质数,请你输出 C a b m o d p C_{a}^{b} \bmod p Cabmodp的值。

输入格式

第一行包含整数 n n n

接下来 n n n行,每行包含一组 a a a, b b b, p p p

输出格式

n n n行,每行输出一个询问的解。

数据范围

1 ≤ n ≤ 20 1 \le n \le 20 1n20

1 ≤ b ≤ a ≤ 1 0 18 1 \le b \le a \le 10^{18} 1ba1018

1 ≤ p ≤ 1 0 5 1 \le p \le 10^5 1p105,

思路

到这一题我们可以发现 a a a b b b的数据范围变得非常大,并且模数 p p p也不再是一个固定值,因此我们引入一个新的定理——Lucas定理:
C a b ≡ C a m o d p b m o d p ⋅ C a / p b / p ( m o d p ) C_{a}^{b} \equiv C_{a \mod p}^{b \mod p} \cdot C_{a / p}^{b / p} \pmod p CabCamodpbmodpCa/pb/p(modp)
也就是我们可以将组合数分解为两个更小的组合数的乘积,并且可以递归分解,直到我们可以处理

这里的证明比较复杂,我们将y总的证明主要分为两点进行说明:

  1. 🏫 第一点是对于任意质数 p p p,有$(1 + x)^p \equiv 1 + x^p \pmod p $

    这个等式中 p p p一定要是质数,这是一个强条件,我们可以通过二项式定理进行证明,我们将 ( 1 + x ) p (1 + x)^p (1+x)p用二项式定理展开可得:
    ( 1 + x ) p = ∑ k = 0 p C p k ⋅ 1 p − k ⋅ x k = ∑ k = 0 p C p k ⋅ x k = C p 0 + C p 1 ⋅ x + C p 2 ⋅ x 2 + ⋯ + C p p ⋅ x p (1+x)^p = \sum_{k=0}^{p} C_p^k \cdot 1^{p-k} \cdot x^k = \sum_{k=0}^{p} C_p^k \cdot x^k = C_p^0 + C_p^1 \cdot x + C_p^2 \cdot x^2 + \cdots + C_p^p \cdot x^p (1+x)p=k=0pCpk1pkxk=k=0pCpkxk=Cp0+Cp1x+Cp2x2++Cppxp
    其中,$ C_p^k $ 表示从 $ p $ 个不同元素中取出 $ k $ 个元素的组合数。

    而对于任意质数 p p p,当 $ 1 \leq k \leq p-1 $ 时,有 $ p $ 能整除 $ C_p^k $。这是因为:
    C p k = p ! k ! ( p − k ) ! = p ⋅ ( p − 1 ) ⋅ ( p − 2 ) ⋯ ( p − k + 1 ) k ! C_p^k = \frac{p!}{k!(p-k)!} = \frac{p \cdot (p-1) \cdot (p-2) \cdots (p-k+1)}{k!} Cpk=k!(pk)!p!=k!p(p1)(p2)(pk+1)
    由于 p p p 是质数,且 k k k p − k p-k pk 均小于 p p p,因此 p p p 在分子中作为因子出现,而在分母中没有对应的因子可以消去,所以 p p p 能整除 C p k C_p^k Cpk

    那么由于 p p p 能整除 C p k C_p^k Cpk(当 1 ≤ k ≤ p − 1 1 \leq k \leq p-1 1kp1 时),因此在模 p p p 的意义下,这些项都等于 0:
    C p k ⋅ x k ≡ 0 ( m o d p ) ( 1 ≤ k ≤ p − 1 ) C_p^k \cdot x^k \equiv 0 \pmod p \quad (1 \leq k \leq p-1) Cpkxk0(modp)(1kp1)
    这意味着在 ( 1 + x ) p (1+x)^p (1+x)p 的展开式中,除了 C p 0 C_p^0 Cp0 C p p C_p^p Cpp 这两项外,其他所有项在模 p p p 的意义下都为 0。

    那么我们就可以将 ( 1 + x ) p (1 + x)^p (1+x)p在模 p p p的意义下进行简化:
    ( 1 + x ) p ≡ C p 0 + C p p ⋅ x p m o d p (1+x)^p \equiv C_p^0 + C_p^p \cdot x^p \mod p (1+x)pCp0+Cppxpmodp
    由于 C p 0 = 1 C_p^0 = 1 Cp0=1 C p p = 1 C_p^p = 1 Cpp=1(因为从 $ p $ 个元素中取出 $ p $ 个或 0 个元素的组合数都是 1),所以得证:

    ( 1 + x ) p ≡ 1 + x p m o d p (1+x)^p \equiv 1 + x^p \mod p (1+x)p1+xpmodp

  2. 🏫第二点就是将 a a a b b b都写为 p p p进制数
    a = a k p k + a k − 1 p k − 1 + ⋯ + a 1 p + a 0 a = a_k p^k + a_{k-1} p^{k-1} + \cdots + a_1 p + a_0 a=akpk+ak1pk1++a1p+a0

    b = b k p k + b k − 1 p k − 1 + ⋯ + b 1 p + b 0 b = b_k p^k + b_{k-1} p^{k-1} + \cdots + b_1 p + b_0 b=bkpk+bk1pk1++b1p+b0

    ( 1 + x ) a (1 + x)^a (1+x)a可以表示为 ( 1 + x ) a k p k + a k − 1 p k − 1 + ⋯ + a 1 p + a 0 (1+x)^{a_k p^k + a_{k-1} p^{k-1} + \cdots + a_1 p + a_0} (1+x)akpk+ak1pk1++a1p+a0,将指数相加变为底数相乘:
    ( 1 + x ) a k p k ⋅ ( 1 + x ) a k − 1 p k − 1 ⋅ … ⋅ ( 1 + x ) a 1 p ⋅ ( 1 + x ) a 0 (1+x)^{a_k p^k} \cdot (1+x)^{a_{k-1} p^{k-1}} \cdot \ldots \cdot (1+x)^{a_1 p} \cdot (1+x)^{a_0} (1+x)akpk(1+x)ak1pk1(1+x)a1p(1+x)a0
    这里可以将 p k p^{k} pk都先计算,即写成两层指数的形式
    ( 1 + x ) a = ( ( 1 + x ) p k ) a k ⋅ ( ( 1 + x ) p k − 1 ) a k − 1 ⋅ ⋯ ⋅ ( ( 1 + x ) p 1 ) a 1 ⋅ ( ( 1 + x ) p 0 ) a 0 (1 + x)^a = ((1+x)^{p^k})^{a_k } \cdot ((1+x)^{p^{k - 1}})^{a_{k - 1}} \cdot \cdots \cdot ((1+x)^{p^1})^{a_1} \cdot ((1+x)^{p^0})^{a_0} (1+x)a=((1+x)pk)ak((1+x)pk1)ak1((1+x)p1)a1((1+x)p0)a0
    根据上面的第一点我们可以得到
    ( 1 + x ) a ≡ ( 1 + x p k ) a k ⋅ ( 1 + x p k − 1 ) a k − 1 ⋅ ⋯ ⋅ ( 1 + x p 1 ) a 1 ⋅ ( 1 + x p 0 ) a 0 ( m o d p ) (1 + x)^a \equiv (1+x^{p^k})^{a_k } \cdot (1+x^{p^{k - 1}})^{a_{k - 1}} \cdot \cdots \cdot (1+x^{p^1})^{a_1} \cdot (1+x^{p^0})^{a_0} \pmod p (1+x)a(1+xpk)ak(1+xpk1)ak1(1+xp1)a1(1+xp0)a0(modp)
    到这里我们通过对比两遍 x b x^{b} xb的系数就可以知道 C a b ≡ C a k b k C a k − 1 b k − 1 ⋅ ⋯ ⋅ C a 1 b 1 C a 0 b 0 ( m o d p ) C_{a}^{b} \equiv C_{a_k}^{b^k}C_{a_{k - 1}}^{b^{k - 1}} \cdot \cdots \cdot C_{a_1}^{b^1}C_{a_0}^{b^0} \pmod p CabCakbkCak1bk1Ca1b1Ca0b0(modp)

这里给出一个例子吧,可能会好理解一点(应该正确吧)

假设想要计算 C ( 10 , 5 ) m o d 3 C(10, 5) \mod 3 C(10,5)mod3,其中 a = 10 a = 10 a=10 b = 5 b = 5 b=5 p = 3 p = 3 p=3
a a a b b b转换为3进制数:
1 0 10 = 10 1 3 10_{10} = 101_3 1010=1013(因为 10 = 1 ⋅ 3 2 + 0 ⋅ 3 1 + 1 ⋅ 3 0 10 = 1 \cdot 3^2 + 0 \cdot 3^1 + 1 \cdot 3^0 10=132+031+130
5 10 = 1 2 3 5_{10} = 12_3 510=123(因为 5 = 1 ⋅ 3 1 + 2 ⋅ 3 0 5 = 1 \cdot 3^1 + 2 \cdot 3^0 5=131+230
应用Lucas定理:
C ( 10 , 5 ) ≡ C ( 1 , 1 ) ⋅ C ( 0 , 2 ) ⋅ C ( 1 , 0 ) m o d 3 C(10, 5) \equiv C(1, 1) \cdot C(0, 2) \cdot C(1, 0) \mod 3 C(10,5)C(1,1)C(0,2)C(1,0)mod3
由于 C ( 0 , 2 ) = 0 C(0, 2) = 0 C(0,2)=0(因为从0个元素中选取2个元素是不可能的),所以整个表达式的结果为0。
因此, C ( 10 , 5 ) m o d 3 = 0 C(10, 5) \mod 3 = 0 C(10,5)mod3=0

代码

#include <iostream>
#include <cstring>
#include <cstring>
#include <algorithm>using namespace std;typedef long long LL;int p;int qmi(int a, int k)
{int res = 1;while(k){if(k & 1) res = (LL)res * a % p;a = (LL)a * a % p;k >>= 1;}return res;
}int C(int a, int b)
{if (b > a) return 0;int res = 1;for (int i = 1, j = a; i <= b; i ++, j -- ){res = (LL)res * j % p;res = (LL)res * qmi(i, p - 2) % p;}return res;
}int lucas(LL a, LL b)
{if(a < p && b < p) return C(a, b);return (LL)C(a % p, b % p) * lucas(a / p, b / p) % p;
}int main()
{int n;cin >> n;while(n --){LL a, b;cin >> a >> b >> p;cout << lucas(a, b) << endl;}return 0;
}

Acwing 888. 求组合数 IV

[原题链接](887. 求组合数 III - AcWing题库)

输入 a a a b b b,求 C a b C_{a}^{b} Cab的值。

注意结果可能很大,需要使用高精度计算。

输入格式

共一行,包含 a a a, b b b的值。

输出格式

共一行,输出 C a b C_{a}^{b} Cab的值

数据范围

1 ≤ b ≤ a ≤ 5000 1 \le b \le a \le 5000 1ba5000

思路

这一题的区别是没有了模数,这意味着我们的答案会非常大,因此需要使用高精度来进行计算,我们直接通过计算式进行计算即可 C a b = a ! ( a − b ) ! b ! C_{a}^{b} = \frac{a!}{(a - b)!b!} Cab=(ab)!b!a!,但是这样我们就需要进行高精度乘法以及高精度除法,因此可以进行一些优化。

优化的思路是进行质因数分解,需要统计出答案数的所有质因数的指数,这里涉及到的一个知识点就是一个数阶乘a!的某个质因子p的指数为 ⌊ a p ⌋ + ⌊ a p 2 ⌋ + ⌊ a p 3 ⌋ + ⋯ \lfloor \frac{a}{p} \rfloor + \lfloor \frac{a}{p^2} \rfloor + \lfloor \frac{a}{p^3} \rfloor + \cdots pa+p2a+p3a+

这应该挺好理解的, a ! a! a!会涉及到所有的 1 ∼ a 1 \sim a 1a中的数,那么对于包含了 p p p作为质因子的这些数而言,我们首先统计最后能够贡献一次的数的个数,即 ⌊ a p ⌋ \lfloor \frac{a}{p} \rfloor pa;但其中也会有能够贡献两次或更多次的数,也就是 p k ( k ≥ 2 ) p^k \; (k \ge 2) pk(k2)为其因子,对于这些数我们在统计一次 p 1 p^1 p1时已经统计了一次了,因此对于包含 p 2 p^2 p2为因子的数,只需再统计一次即可,即加上 ⌊ a p 2 ⌋ \lfloor \frac{a}{p^2} \rfloor p2a,以此类推。

这里的代码会涉及到之前的筛质数以及高精度乘法,可以先去看一下。

代码

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>using namespace std;const int N = 5010;int primes[N], cnt;
int sum[N];
bool st[N];void get_primes(int n)
{for(int i = 2; i <= n; i ++){if(!st[i]) primes[cnt ++] = i;for(int j = 0; primes[j] <= n / i; j ++){st[i * primes[j]] = true;if(i % primes[j] == 0) break;}}
}int get(int n, int p)
{int res = 0;while(n){res += (n / p);n /= p;}return res;
}vector<int> mul(vector<int> a, int b)
{vector<int> c;int t = 0;for(int i = 0; i < a.size(); i ++){t += a[i] * b;c.push_back(t % 10);t /= 10;}while(t) c.push_back(t % 10), t /= 10;return c;
}int main()
{int a, b;cin >> a  >> b;get_primes(a);for(int i = 0; i < cnt; i ++){int p = primes[i];sum[i] = get(a, p) - get(a - b, p) - get(b, p);}vector<int> res;res.push_back(1);for(int i = 0; i < cnt; i ++)for(int j = 0; j < sum[i]; j ++)res = mul(res, primes[i]);for(int i = res.size() - 1; i >= 0; i --) cout << res[i];puts("");return 0;
}

Acwing 889. 满足条件的01序列

[原题链接](889. 满足条件的01序列 - AcWing题库)

给定 n n n 0 0 0 n n n 1 1 1,它们将按照某种顺序排成长度为 2 n 2n 2n的序列,求他们能排列成的所有序列中,能构满足任意前缀序列中 0 0 0的个数都不少于 1 1 1的个数的序列有多少个。

输出的答案对 1 0 9 + 7 10^9+7 109+7取模

输入格式

共一行,包含整数 n n n

输出格式

共一行,包含一个整数,表示答案。

数据范围

1 ≤ n ≤ 1 0 5 1 \le n \le 10^5 1n105

思路

这一题其实是卡特兰数的一种数学模型,这里就先直接给出他的计算公式了(百度学了一下,应该不止这一种公式,这里就写y总讲的了)
h ( n ) = C 2 n n − C 2 n n − 1 = C 2 n n n + 1 h(n) = C_{2n}^{n} - C_{2n}^{n - 1} = \frac{C_{2n}^{n}}{n + 1} h(n)=C2nnC2nn1=n+1C2nn
我们这里也用y总讲的模型进行讲解——可以将其看为一个路径计数的问题

我们将选 0 0 0看做向左走一步,选 1 1 1看做向上走一步,假设我们一共需要走12步,那么我们一半一半选的终点就是 ( 6 , 6 ) (6,6) (6,6),并且所有的路径方案数为 C 2 n n = C 12 6 C_{2n}^{n} = C_{12}^{6} C2nn=C126下图中给出了一条符合题意的路径,大家可以看一下,到达终点前的所有前缀路径中向左走的步数都不小于向上走的步数,图中红线为对称线
在这里插入图片描述

要找出的是所有符合这种条件的路径,因此可以反向思考,也就是找到所有不符合条件的路径,在下图中给出了一条不符合题意的橙色路径,图中紫色斜线为另一条关键线,可以看到,当橙色路径第一次碰到紫色斜线时,表明其破坏了题目所要求的条件,我们也由此可以看出若一条路径会碰到或者穿过紫色斜线,其为不符合题意的路径,我们要做的就是找出所有这样的路径。
在这里插入图片描述

这里的做法比较巧妙,我们将橙色路径第一次碰到紫色斜线的部分后面进行轴对称,如下图绿色路径所示,所有经过紫色斜线的路径经过这样操作之后,其终点一定为点 ( 5 , 7 ) (5,7) (5,7),因为在轴对称之前的终点固定是 ( 6 , 6 ) (6,6) (6,6)

那么就可以得出这样的结论:所有从 ( 0 , 0 ) (0,0) (0,0)出发到达点 ( 5 , 7 ) (5,7) (5,7)的路径都可以由不满足题意的到达 ( 6 , 6 ) (6,6) (6,6)的路径经过上述变换得到,其数量为 C 2 n n − 1 = C 12 5 C_{2n}^{n - 1} = C_{12}^{5} C2nn1=C125

因此最后要求的路径数目就是 C 12 6 − C 12 5 C_{12}^{6} - C_{12}^{5} C126C125
在这里插入图片描述

最后实现到代码上我们肯定要进一步化简,也就是 h ( n ) = C 2 n n − C 2 n n − 1 = C 2 n n n + 1 h(n) = C_{2n}^{n} - C_{2n}^{n - 1} = \frac{C_{2n}^{n}}{n + 1} h(n)=C2nnC2nn1=n+1C2nn

看题目给出的数据范围是 1 0 5 10^5 105,因此需要使用的是上面组合数第二题的计算方法。

代码

#include <iostream>
#include <algorithm>using namespace std;typedef long long LL;const int N = 100010, mod = 1e9 + 7;int qmi(int a, int k, int p)
{int res = 1;while (k){if (k & 1) res = (LL)res * a % p;a = (LL)a * a % p;k >>= 1;}return res;
}int main()
{int n;cin >> n;int a = n * 2, b = n;int res = 1;for (int i = a; i > a - b; i -- ) res = (LL)res * i % mod;for (int i = 1; i <= b; i ++ ) res = (LL)res * qmi(i, mod - 2, mod) % mod;res = (LL)res * qmi(n + 1, mod - 2, mod) % mod;cout << res << endl;return 0;
}

相关文章:

数据结构与算法学习笔记----求组合数

数据结构与算法学习笔记----求组合数 author: 明月清了个风 first publish time: 2025.1.27 ps⭐️一组求组合数的模版题&#xff0c;因为数据范围的不同要用不同的方法进行求解&#xff0c;涉及了很多之前的东西快速幂&#xff0c;逆元&#xff0c;质数&#xff0c;高精度等…...

Arouter详解・常见面试题

前言&#xff1a;ARouter是一个用于 Android App 进行组件化改造的路由框架 —— 支持模块间的路由、通信、解耦。 一、路由简介&#xff1a; 路由&#xff1a;就是通过互联的网络把信息从源地址传输到目的地址的活动。完成路由这个操作的实体设备就是 路由器&#xff08;Rout…...

全志开发板 视频输入框架

笔记来源于百问网出品的教程。 1.VIN camera驱动框架 • 使用过程中可简单的看成是vin 模块 device 模块af driver flash 控制模块的方式&#xff1b; • vin.c 是驱动的主要功能实现&#xff0c;包括注册/注销、参数读取、与v4l2 上层接口、与各device 的下层接口、中断处…...

寒假学web--day10

简介 一些高级的反序列化 phar反序列化 phar类似于java的jar包&#xff0c;将多个php文件合并为独立的压缩包&#xff0c;不用解压就能执行里面的php文件&#xff0c;支持web服务器和命令行 metadata $phar->setmetadata($h); metadata可以存放一个类实例&#xff0c;…...

【全栈】SprintBoot+vue3迷你商城(9)

【全栈】SprintBootvue3迷你商城&#xff08;9&#xff09; 往期的文章都在这里啦&#xff0c;大家有兴趣可以看一下 后端部分&#xff1a; 【全栈】SprintBootvue3迷你商城&#xff08;1&#xff09; 【全栈】SprintBootvue3迷你商城&#xff08;2&#xff09; 【全栈】Spr…...

系统思考—问题分析

很多中小企业都在面对转型的难题&#xff1a;市场变化快&#xff0c;资源有限&#xff0c;团队协作不畅……这些问题似乎总是困扰着我们。就像最近和一位企业主交流时&#xff0c;他提到&#xff1a;“我们团队每天都很忙&#xff0c;但效率始终没见提升&#xff0c;感觉像是在…...

系统架构设计师教材:信息系统及信息安全

信息系统 信息系统的5个基本功能&#xff1a;输入、存储、处理、输出和控制。信息系统的生命周期分为4个阶段&#xff0c;即产生阶段、开发阶段、运行阶段和消亡阶段。 信息系统建设原则 1. 高层管理人员介入原则&#xff1a;只有高层管理人员才能知道企业究竟需要什么样的信…...

美国三种主要的个人数据产业模式简析

文章目录 前言一、个人征信(Credit Reporting)模式1、定义:2、特点:数据来源:核心功能:服务对象:代表性公司:监管框架:示例应用:二、面向垂直场景的个人数据公司(Consumer Reporting,消费者报告模式)1、定义:2、特点:数据来源:核心功能:服务对象:主要公司:监…...

js手撕 | 使用css画一个三角形 使用js修改元素样式 驼峰格式与“-”格式相互转化

1.使用css画一个三角形 借助 border 实现&#xff0c;在 width 和 height 都为 0 时&#xff0c;设置 border&#xff0c;便会呈现三角形。想要哪个方向的三角形&#xff0c;设置其他三边为 透明即可。同时&#xff0c;可以通过调整不同边的宽度&#xff0c;来调整三角形的高度…...

每日一道算法题

题目&#xff1a;最长递增子序列的个数 给定一个未排序的整数数组&#xff0c;找到最长递增子序列的个数。 示例 1 输入&#xff1a;nums [1,3,5,4,7]输出&#xff1a;2解释&#xff1a;有两个最长递增子序列&#xff0c;分别是 [1,3,4,7] 和 [1,3,5,7] 。 示例 2 输入&a…...

低代码系统-产品架构案例介绍、明道云(十一)

明道云HAP-超级应用平台(Hyper Application Platform)&#xff0c;其实就是企业级应用平台&#xff0c;跟微搭类似。 通过自设计底层架构&#xff0c;兼容各种平台&#xff0c;使用低代码做到应用搭建、应用运维。 企业级应用平台最大的特点就是隐藏在冰山下的功能很深&#xf…...

论文笔记(六十三)Understanding Diffusion Models: A Unified Perspective(三)

Understanding Diffusion Models: A Unified Perspective&#xff08;三&#xff09; 文章概括 文章概括 引用&#xff1a; article{luo2022understanding,title{Understanding diffusion models: A unified perspective},author{Luo, Calvin},journal{arXiv preprint arXiv:…...

利用机器学习创建基于位置的推荐程序

推荐系统被广泛应用于不同的应用程序中&#xff0c;用于预测用户对产品或服务的偏好或评价。在过去的几分钟或几小时里&#xff0c;你很可能在网上遇到过或与某种类型的推荐系统进行过互动。这些推荐系统有不同的类型&#xff0c;其中最突出的包括基于内容的过滤和协作过滤。在…...

每日一题 429. N 叉树的层序遍历

429. N 叉树的层序遍历 /*class Solution { public:vector<vector<int>> levelOrder(Node* root) {queue<Node*> que;que.push(root);vector<vector<int>> ans;if(root nullptr){return ans;}while(!que.empty()){int sizeQue que.size();vec…...

AIP-132 标准方法:List

编号132原文链接AIP-132: Standard methods: List状态批准创建日期2019-01-21更新日期2022-06-02 在许多API中&#xff0c;通常会向集合URI&#xff08;例如 /v1/publishers/1/books &#xff09;发出GET请求&#xff0c;获取集合中资源的列表。 面向资源设计&#xff08;AIP…...

CSAPP学习:前言

前言 本书简称CS&#xff1a;APP。 背景知识 一些基础的C语言知识 如何阅读 Do-做系统 在真正的系统上解决具体的问题&#xff0c;或是编写和运行程序。 章节 2025-1-27 个人认为如下章节将会对学习408中的操作系统与计算机组成原理提供帮助&#xff0c;于是先凭借记忆将其简单…...

【统计的思想】假设检验(二)

假设检验是根据人为设定的显著水平&#xff0c;对被测对象的总体质量特性进行统计推断的方法。 如果我们通过假设检验否定了零假设&#xff0c;只是说明在设定的显著水平下&#xff0c;零假设成立的概率比较小&#xff0c;并不是说零假设就肯定不成立。如果零假设事实上是成立…...

KNN算法学习实践

1.理论学习 原文链接 ShowMeAI知识社区 2.案例实践 假如一套房子打算出租&#xff0c;但不知道市场价格&#xff0c;可以根据房子的规格&#xff08;面积、房间数量、厕所数量、容纳人数等&#xff09;&#xff0c;在已有数据集中查找相似&#xff08;K近邻&#xff09;规格…...

数据可视化的图表

1.折线图反映了一段时间内事物连续的动态变化规律,适用于描述一个变量随另一个变量变化的趋势,通常用于绘制连续数据,适合数据点较多的情况。 2.散点图是以直角坐标系中各点的密集程度和变化趋势来表示两种现象间的相关关系&#xff0c;常用于显示和比较数值。当要在不考虑时间…...

动手学深度学习-卷积神经网络-3填充和步幅

目录 填充 步幅 小结 在上一节的例子&#xff08;下图&#xff09; 中&#xff0c;输入的高度和宽度都为3&#xff0c;卷积核的高度和宽度都为2&#xff0c;生成的输出表征的维数为22。 正如我们在 上一节中所概括的那样&#xff0c;假设输入形状为nhnw&#xff0c;卷积核形…...

【JS|第28期】new Event():前端事件处理的利器

日期&#xff1a;2025年1月24日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…...

Spring Boot 中的事件发布与监听:深入理解 ApplicationEventPublisher(附Demo)

目录 前言1. 基本知识2. Demo3. 实战代码 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 基本的Java知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&am…...

【Spring】Spring启示录

目录 前言 一、示例程序 二、OCP开闭原则 三、依赖倒置原则DIP 四、控制反转IOC 总结 前言 在软件开发的世界里&#xff0c;随着项目的增长和需求的变化&#xff0c;如何保持代码的灵活性、可维护性和扩展性成为了每个开发者必须面对的问题。传统的面向过程或基于类的设计…...

ospf动态路由配置,cost路径调整,ospf认证实验

一、实验拓扑如图&#xff1a; 接口ip配置网络 &#xff1a;10.17.12.* 10.17.13.* &#xff0c;10.17.23.* 回环接口配置分别为 10.0.1.1 &#xff0c;10.0.1.2&#xff0c;10.0.1.3对应三台路由器 ar1配置接口ip interface GigabitEthernet0/0/0 ip address 10.17.12.1…...

在Rust应用中访问.ini格式的配置文件

在Rust应用中访问.ini格式的配置文件&#xff0c;你可以使用第三方库&#xff0c;比如 ini 或 config. 下面是一个使用 ini 库的示例&#xff0c;该库允许你读取和解析.ini文件。 使用 ini 库 添加依赖 首先&#xff0c;你需要在你的 Cargo.toml 文件中添加 ini 库的依赖&am…...

批量处理多个模型的预测任务

#!/bin/bash# 检查是否传入必要的参数&#xff0c;若未传入参数则打印用法并退出 if [ "$#" -lt 1 ]; thenecho "用法: $0 <file_path>"echo "示例: $0 /home/aistudio/work/PaddleSeg/city/cityscapes_urls_extracted.txt"exit 1 fi# 读取…...

Java 编程初体验

Java学习资料 Java学习资料 Java学习资料 一、引言 在当今数字化的时代&#xff0c;编程已然成为一项极具价值的技能。而 Java 作为一门广泛应用于企业级开发、移动应用、大数据等众多领域的编程语言&#xff0c;吸引着无数初学者投身其中。当我们初次踏入 Java 编程的世界&…...

element-plus 的table section如何实现单选

如果是单选那么全新的按钮应该隐藏或者不可编辑的状态。但是我没找到改变成不可编辑的方法&#xff0c;只能采取隐藏 <template><!-- 注意要包一层div根元素&#xff0c;否则css样式可能会不生效&#xff0c;原因不详 --><div><el-table ref"proTab…...

【JavaEE进阶】图书管理系统 - 壹

目录 &#x1f332;序言 &#x1f334;前端代码的引入 &#x1f38b;约定前后端交互接口 &#x1f6a9;接口定义 &#x1f343;后端服务器代码实现 &#x1f6a9;登录接口 &#x1f6a9;图书列表接口 &#x1f384;前端代码实现 &#x1f6a9;登录页面 &#x1f6a9;…...

牛客周赛 Round 77 题解

文章目录 A-时间表B-数独数组D-隐匿社交网络E-1or0 A-时间表 签到题 #include <bits/stdc.h> using namespace std;int main() {int a[6] {20250121,20250123,20250126,20250206,20250208,20250211};int n; cin >> n;cout << a[n - 1];return 0; }B-数独数…...