第六章 数学
第六章 数学
1、整除与同余
2、质因数与公约数
3、素数筛法
4、唯一分解定理与gcd,lcm的关系
5、裴蜀定理
6、快速幂
7、费马小定理
8、逆元
9、约数个数与约束之和
10、欧拉函数
11、矩阵乘法
12、排列组合、二项式定理、集合划分
一、排列数
⭐️帕斯卡恒等式
⭐️隔板法
(组不可以为空)
🌟C(n - 1,k - 1)
📖分球
(组可以为空)
🌟C(n + k - 1,k - 1)
📚分球
二、二项式定理
(了解)
三、集合划分
📖问题描述
static finalint MOD = 1000000007;//模数
static long[][]dp; //记忆化数组
//递归函数计算S(n,k)
public static long stirling(int n, int k) {
//边界条件
if(k=0 || k>n)return 0;// 子集数为0 或大于元素数,无解
if(k== n || k==1)return1;// 每个元素单独成组,或所有元素为一个组
//如果已经计算过,直接返回
if (dp[n][k] != -1) return dp[n][k];
// 使用递推公式计算: S(n,k)= k *S(n-1,k)+ S(n-1,k-1)
dp[n][k] = (1l * k * stirling(n - 1, k) % MOD + stirling(n - 1, k - 1)) % MOD;
return dp[n][k];
}
1️⃣为什么要乘 1l?
2️⃣为什么最后一个式子可以这么写?推导一下。
📚摆放小球
13、求解组合数
📖
dp求组合数
状态定义
dp[i][j]
表示从i个数选择j个数的方案数。
状态转移
根据组合数递推式,对于第j个数我们有选和不选,即dp[i][j]=dp[i-1][j—1]+dp[i-1][j]
初始化
设置所有的dp[i][0]=1
结果
输出给定的dp[a][b]
即可
时间复杂度空间复杂度均为n²。
//创建DP数组
int[][] dp = new int[a + 1][a + 1];
//初始化dp数组
for (int i = 0; i <= a; i++) {
dp[i][0]= 1;
}
// 递推计算C_a^b并对MOD取模
for (int i = 1; i <= a; i++) {
for (int j = 1; j <= i; j++) {
dp[i][j]= (dp[i - 1][j - 1] + dp[i - 1][j]) % MOD;
}
}
//输出结果
System.out.println(dp[a][b]);