【笔记】求解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]。

### C语言学习笔记与资料整理 C语言是一种通用的、过程式的计算机编程语言,支持结构化编程、 lexically scoped 语句以及递归函数调用[^1]。以下是关于C语言学习的一些关键点和参考资料: #### 1. 循环结构 C语言提供了多种循环结构以实现重复操作,包括`while`、`do...while`和`for`语句。以下是一个使用`while`循环的示例代码[^1]: ```c #include <stdio.h> int main() { printf("加入比特\n"); int line = 0; while(line <= 20000) { line++; printf("我要继续努力敲代码\n"); } if(line > 20000) printf("好offer\n"); return 0; } ``` #### 2. 随机数生成与用户交互 在C语言中,可以通过`rand()`函数生成随机数,并结合`time()`函数设置随机种子以确保每次运行时生成不同的随机数。以下是一个猜数字游戏的示例代码[^2]: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { srand(time(0)); int number = rand() % 100 + 1; // 生成1100之间的随机数 int count = 0; int a = 0; printf("我已经想好了一个1-100之间的数\n"); do { printf("请猜数:"); scanf("%d", &a); count++; if (a > number) { printf("你猜的数大了\n"); } else if (a < number) { printf("你猜的数小了\n"); } } while (a != number); printf("太棒了,你用了%d次就猜对了答案\n", count); return 0; } ``` #### 3. 整数逆序求解 对于整数逆序问题,可以利用`%`运算符获取个位数,`/`运算符去掉个位数,逐步构建逆序结果。以下是一个整数逆序的示例代码[^2]: ```c #include <stdio.h> int main() { int x; scanf("%d", &x); int digit; int ret = 0; while (x > 0) { digit = x % 10; ret = ret * 10 + digit; printf("x = %d, ret = %d, digit = %d\n", x, ret, digit); x /= 10; } printf("%d", ret); return 0; } ``` #### 4. 常见错误及调试技巧 在C语言编程过程中,常见的错误包括数组越界访问、指针使用不当、内存泄漏等。为避免这些问题,建议养成良好的编程习惯,例如初始化变量、检查边界条件、使用调试工具(如`gdb`)等。 #### 5. 学习资源推荐 - **书籍**:《C程序设计语言》(The C Programming Language),由Brian W. Kernighan和Dennis M. Ritchie编写。 - **在线教程**:菜鸟教程(https://www.runoob.com/cprogramming/index.html)、GeeksforGeeks(https://www.geeksforgeeks.org/c-programming-language/)。 - **实践平台**:LeetCode、Codeforces、HackerRank等提供丰富的C语言练习题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值