排列组合 C(n,m)

一、求解C(n, m)

公式一:

 

公式二:

公式二可以这么理解,从n个物品中取m个有2种情况:(1)不取第n个物品,于是从前n-1个中取m个; (2)取第n个物品,于是从前n-1个中取m-1; 所以答案是这两种情况的和

 

二、求解C(n, m)%p,p为大质数

当n,m,p都很大的时候,用公式二肯定不行了,费时间又费内存,这时候要用公式一,问题是取模时怎样可以把除法转化为乘法?

费马小定理: 若p是质数,且a,p互质,那么 a的(p-1)次方除以p的余数恒等于1, 即a^(p-1)  ≡ 1 (mod p),所以a^(p-2) ≡ 1/a  (mod p)

公式三:

这里求阶乘的时候要一边乘一边取模,求p-2次方的时候要要快速幂

 

三、求解C(n, m)%p,p为小质数

Lucas定理:n,m是非负整数,p是质数,将n,m写成p进制的形式,即:n=(a[k], a[k-1]...., a[0])p,m=(b[k], b[k-1]..., b[0])p,则

公式四:

公式五:

在对上面公式证明之前,我们先证明一下下面这个公式

公式六:

证明公式六:

 

 证明公式五:

 

四、范德蒙恒等式

公式七:

证明:

1.

2.可以这么理解:从n+m个球中取k个球,相当于将球分为两部分,分别有n个球和m个球;结果相当于从n个球中取i个的球情况下,从m个球中取k-i个球,i的范围是[0,k]。

 

相关练习:
CF 785D Anton and School - 2       题解

HDU 4349 Xiao Ming's Hope        题解

  • 23
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
二维数组的排列组合可以使用嵌套循环实现。假设有一个二维数组arr[m][n],要将它中的元素进行排列组合,可以按照以下思路实现: 1. 外层循环控制行数,内层循环控制列数。 2. 内层循环中,将当前元素与后面的元素进行交换,然后递归调用排列组合函数。 3. 递归终止条件是当前行数等于总行数,表示已经排列完毕,将结果输出。 以下是一个简单的示例代码: ```c #include <stdio.h> void perm(int arr[][3], int m, int n, int row) { if (row == m) { // 输出结果 for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { printf("%d ", arr[i][j]); } printf("\n"); } printf("\n"); return; } for (int i = row; i < m; i++) { for (int j = 0; j < n; j++) { // 交换当前元素和后面的元素 int temp = arr[row][j]; arr[row][j] = arr[i][j]; arr[i][j] = temp; // 递归调用排列组合函数 perm(arr, m, n, row+1); // 恢复原始状态 temp = arr[row][j]; arr[row][j] = arr[i][j]; arr[i][j] = temp; } } } int main() { int arr[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; perm(arr, 3, 3, 0); return 0; } ``` 在这个示例代码中,我们将一个3x3的二维数组arr进行排列组合,并输出结果。运行结果如下: ``` 1 2 3 4 5 6 7 8 9 1 2 3 4 5 9 7 8 6 1 2 3 4 6 5 7 8 9 1 2 3 4 6 9 7 8 5 1 2 3 4 5 6 7 9 8 1 2 3 4 5 9 7 6 8 1 2 3 4 6 5 7 9 8 1 2 3 4 6 9 7 5 8 1 2 3 4 5 6 9 8 7 1 2 3 4 5 9 9 8 6 1 2 3 4 6 5 9 8 7 1 2 3 4 6 9 9 8 5 1 2 3 5 4 6 7 8 9 1 2 3 5 4 9 7 8 6 1 2 3 5 6 4 7 8 9 1 2 3 5 6 9 7 8 4 1 2 3 5 4 6 7 9 8 1 2 3 5 4 9 7 6 8 1 2 3 5 6 4 7 9 8 1 2 3 5 6 9 7 4 8 1 2 3 5 4 6 9 8 7 1 2 3 5 4 9 9 8 6 1 2 3 5 6 4 9 8 7 1 2 3 5 6 9 9 8 4 1 2 3 6 4 5 7 8 9 1 2 3 6 4 9 7 8 5 1 2 3 6 5 4 7 8 9 1 2 3 6 5 9 7 8 4 1 2 3 6 4 5 7 9 8 1 2 3 6 4 9 7 5 8 1 2 3 6 5 4 7 9 8 1 2 3 6 5 9 7 4 8 1 2 3 6 4 5 9 8 7 1 2 3 6 4 9 9 8 5 1 2 3 6 5 4 9 8 7 1 2 3 6 5 9 9 8 4 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值