数学知识第八期 组合数全集

news2024/10/7 12:26:57

前言:组合数在高中大家应该都学过,也是一个重要的数学知识,希望大家能够完全掌握

一、组合数基本知识

定义:

组合是数学的重要概念之一。从 n 个不同元素中每次取出 m 个不同元素 ,不管其顺序合成一组,称为从 n 个元素中不重复地选取 m 个元素的一个组合。所有这样的组合的种数称为组合数。

计算公式:

在线性写法中被写作C(n,m)。
组合数的计算公式为

n 元集合 A 中不重复地抽取 m 个元素作成的一个组合实质上是 A 的一个 m 元子集合。如果给集 A 编序 成为一个序集,那么 A 中抽取 m 个元素的一个组合对应于数段 到序集 A 的一个确定的严格保序映射。组合数 的常用符号还有

实际上是自然数集上的二元运算,这种运算既不满足交换律也不满足结合律。

性质:

互补性质

组合数基本公式
即从n个不同元素中取出m个元素的组合数=从n个不同元素中取出 (n-m) 个元素的组合数;
这个性质很容易理解,例如C(9,2)=C(9,7),即从9个元素里选择2个元素的方法与从9个元素里选择7个元素的方法是相等的。
规定:C(n,0)=1 C(n,n)=1 C(0,0)=1
2.组合恒等式
若表示在 n 个物品中选取 m 个物品,则如存在下述公式:C(n,m)=C(n,n-m)=C(n-1,m-1)+C(n-1,m)。

二、例题

1.组合数I

AC代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 2010, mod = 1e9 + 7;
int C[N][N], T;

void init() {
    for (int i = 0; i < N; ++ i) {
        for (int j = 0; j <= i; ++ j) {
            if (j == 0 || j == i)   C[i][j] = 1;
            else    C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mod;
        }
    }
}

int main()
{
    init();
    scanf("%d", &T);
    while (T -- ) {
        int n, m;
        scanf("%d%d", &n, &m);
        printf("%d\n", C[n][m]);
    }
    return 0;
}

2.组合数II


AC代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10, P = 1e9 + 7;
using LL = long long ;
int fact[N], infact[N];
int T;

int qmi(int a, int b) {
    int ans = 1;
    while (b) {
        if (b & 1)  ans = (LL)ans * a % P;
        a = (LL)a * a % P;
        b >>= 1;
    }
    return ans;
}

void init() {
    fact[0] = infact[0] = 1;
    for (int i = 1; i < N; ++ i) {
        fact[i] = (LL)fact[i - 1] * i % P;
        infact[i] = (LL)infact[i - 1] * qmi(i, P - 2) % P;
    }
}

int main()
{
    init();
    scanf("%d", &T);
    while (T -- ) {
        int n, m;
        scanf("%d%d", &n, &m);
        printf("%d\n", (LL)fact[n] * infact[m] % P * infact[n - m] % P);
    }
    return 0;
}

3、组合数III

AC代码:

#include <bits/stdc++.h>
using namespace std;
using LL = long long ;
int T, P;

int qmi(int a, int b) {
    int ans = 1;
    while (b) {
        if (b & 1)  ans = (LL)ans * a % P;
        a = (LL)a * a % P;
        b >>= 1;
    }
    return ans;
}

// 递推求解朴素的C(a,b)
int C(int n, int m) {
    if (m > n)  return 0;
    int ans = 1;
    // i控制的是分母的循环,对于b!,从1到b总共有b个数
    // j控制的是分子的循环,从a到a-b+1总共有b个数
    // 因此可以发现,分子和分母循环的次数是相同的
    for (int i = 1, j = n; i <= m; ++ i, -- j) {
        ans = (LL)ans * j % P;
        ans = (LL)ans * qmi(i, P - 2) % P;
    }
    return ans;
}

// 用Lucas定理递归求解
int Lucas(LL n, LL m) {
    if (n < P && m < P )    return C(n, m);
    return (LL)C(n % P, m % P) * Lucas(n / P, m / P) % P;
}

int main()
{
    scanf("%d", &T);
    while (T -- ) {
        LL n, m;
        scanf("%lld%lld%d", &n, &m, &P);
        printf("%d\n", Lucas(n, m));
    }
    return 0;
}

4、组合数IV

AC代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 50010;
int s[N], primes[N], cnt;
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; j < cnt && primes[j] <= n / i; ++ j) {
            st[i * primes[j]] = true;
            if (i % primes[j] == 0 )    break;
        }
    }
}

int get(int n, int p) {
    int ans = 0;
    while (n) {
        ans += n / p;
        n /= p;
    }
    return ans;
}

vector<int> mul(vector<int> &A, int b) {
    vector<int> C;
    for (int i = 0, t = 0; i < A.size() || t; ++ i) {
        if (i < A.size())   t += A[i] * b;
        C.push_back(t % 10);
        t /= 10;
    }
    while (C.size() > 1 && C.back() == 0)   C.pop_back();
    return C;
}

int main()
{
    int n, m;
    scanf("%d%d", &n, &m);
    get_primes(n);
    for (int i = 0; i < cnt; ++ i) {
        int p = primes[i];
        s[i] = get(n, p) - get(m, p) - get(n - m, p);
    }
    
    vector<int> ans;
    ans.push_back(1);
    for (int i = 0; i < cnt; ++ i)
        for (int j = 0; j < s[i]; ++ j)
            ans = mul(ans, primes[i]);
    
    for (int i = ans.size() - 1; i >= 0; -- i)
        printf("%d", ans[i]);
    puts("");
    
    return 0;
}

5、满足条件的01序列

AC代码:

// 写法1
#include <bits/stdc++.h>
using namespace std;
const int P = 1e9 + 7;
using LL = long long ;
int n;

int qmi(int a, int b) {
    int ans = 1;
    while (b) {
        if (b & 1)  ans = (LL)ans * a % P;
        a = (LL)a * a % P;
        b >>= 1;
    }
    return ans;
}

int main() {
    scanf("%d", &n);
    int a = 2 * n, b = n, ans = 1;
    for (int i = 1, j = a; i <= n; ++ i, -- j) {
        ans = (LL)ans * j % P;
        ans = (LL)ans * qmi(i, P - 2) % P;
    }
    
    ans = (LL)ans * qmi(n + 1, P - 2) % P;
    printf("%lld\n", ans);
    
    return 0;
}

总结

感谢大家的观看,谢谢大家!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1426268.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YIA主题如何关闭新版本升级提示?WordPress主题怎么取消升级提醒?

前两天YIA主题发布了升级到2.8版本&#xff0c;新增了一些功能&#xff0c;优化调整修复了一些功能&#xff0c;但是这些功能调整幅度不大&#xff0c;加上boke112百科使用的YIA主题已经进行了很多方面的个性化修改&#xff0c;所以就懒得升级了&#xff0c;但是每次进入WordPr…

C++——数据类型

C——数据类型 1.基本变量类型 C 基本数据类型整理成表格。以下是一个表格&#xff0c;展示了不同的基本数据类型及其一般用途和大小范围&#xff1a;和C语言类似。 2.宽字符的用法 #include <iostream> #include <locale> #include <wchar.h> int main…

Vue(二十):ElementUI 扩展实现表格组件的拖拽行

效果 源码 注意&#xff1a; 表格组件必须添加 row-key 属性&#xff0c;用来优化表格的渲染 <template><el-row :gutter"10"><el-col :span"12"><el-card class"card"><el-scrollbar><span>注意: 表格组件…

FreeRTOS_Stm32F407系列单片机标准库移植

这里写目录标题 1、下载FreeRTOS源码1.1github仓库下载1.2官网下载1.3百度网盘下载 2、FreeRTOS移植2.1首先需要有一个可运行的标准库工程2.2在工程内创建一个FreeRTOS文件夹&#xff0c;然后在FreeRTOS文件夹中再新建port、include、src三个文件夹。2.3 port文件夹移植2.4 inc…

Android使用ScrollView导致鼠标点击事件无效

平台 测试平台: RK3288 Android8.1RK3588 Android 12 问题 首先, 这个问题的前提是, 使用的输入设备是**鼠标**, 普通的触摸屏并不会出现这个问题. 大致的流程是APP的UI布局中采用ScrollView作为根容器, 之后添加各类子控件, 在一起准备就绪后, 使用鼠标进行功能测试, 出现…

AD24-固定孔放置

1、固定孔放置的一般距离&#xff0c;分为金属和非金属 2、固定孔通过焊盘完成&#xff0c;放置焊盘&#xff0c;并将层修改为Multi Layer 焊盘与固定孔的等大小的 3、金属与非金属的区别 ①非金属 ②金属 4、设置固定孔放置的距离 5、通过复制粘贴即可完成其他孔的放置 6、导…

时间序列预测模型实战案例(二)(Holt-Winter)(Python)结合K-折交叉验证进行时间序列预测实现企业级预测精度(包括运行代码以及代码讲解)

目录 引言 数据格式 运行代码 Holt-Winters模型主体 程序入口 参数讲解 开始训练 预测结果 引言 话不多说上来先上预测精度分析图,其中MAE的误差大概在0.11,以下数据均是预测未知数据&#xff0c;而不是训练数据的预测图。 开始之前我们先来简单了解一下Holt-Winters…

数据结构+算法(第02篇):玩扫雷就是优化算法

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

网安渗透攻击作业(2)

sql注入第一关 一、部署 1、环境安装 &#xff08;1&#xff09;下载phpstudy&#xff0c;下载链接&#xff1a;小皮面板(phpstudy) - 让天下没有难配的服务器环境&#xff01; &#xff0c;安装过后打开软件进入如下界面&#xff0c;接着我们开启nginx和mysql 注意&#x…

Linux--Shell基础

学习笔记&#xff0c;记录以下课程中关于Linux的Shell基础知识。 黑马程序员linux入门到精通&#xff08;下部分&#xff09;_哔哩哔哩_bilibili 目录 1.编写规范 2.变量 2.1 变量的含义 2.2 变量的定义和使用 2.3 只读变量&#xff08;了解&#xff09; 2.4 接收用户输入…

Linux 命令 —— top

Linux 命令 —— top 相对于 ps 是选取一个时间点的进程状态&#xff0c;top 则可以持续检测进程运行的状态。使用方式如下&#xff1a; 用法&#xff1a; top [-d secs] | [-p pid] 选项与参数&#xff1a; -d secs&#xff1a;整个进程界面更新 secs 秒。默认是 5 5 5 秒。…

遇到ubuntu设置交叉编译环境的问题

今天交叉编译器一直没安装成功&#xff0c;环境变量也配置了还是不对&#xff0c;最后发现Ubuntu是64位的要装 然后就好了 另外在进行嵌入式Linux开发的时候&#xff0c;要把主机、虚拟机、以及开发板设置在同一网段下&#xff0c;虚拟机一般设成临时的就可以&#xff0c;但是…

力扣之2648.生成 斐波那契数列(yield)

/*** return {Generator<number>}*/ var fibGenerator function*() {let a 0,b 1;yield 0; // 返回 0&#xff0c;并暂停执行yield 1; // 返回 1&#xff0c;并暂停执行while(true) {yield a b; // 返回 a b&#xff0c;并暂停执行[a, b] [b, a b]; // 更新 a 和 …

使用Pycharm在本地调用chatgpt的接口

目录 1.安装环境 2.建立多轮对话的完整代码&#xff08;根据自己使用的不同代理需要修改端口&#xff08;port&#xff09;&#xff09; 3.修改代码在自己的Pycharm上访问chagpt的api并实现多轮对话&#xff0c;如果不修改是无法成功运行的。需要确定秘钥和端口以保证正常访…

使用pygame建立一个简单的使用键盘方向键移动的方块小游戏

import pygame import sys# 初始化pygame pygame.init()# 设置窗口大小 screen_size (640, 480) # 创建窗口 screen pygame.display.set_mode(screen_size) # 设置窗口标题 pygame.display.set_caption("使用键盘方向键移动的方块的简单小游戏")# 设置颜色 bg_colo…

CHS_08.2.3.6_1+生产者-消费者问题

CHS_08.2.3.6_1生产者-消费者问题 问题描述问题分析思考&#xff1a;能否改变相邻P、V操作的顺序&#xff1f;知识回顾 在这个小节中 我们会学习一个经典的进程同步互斥的问题 问题描述 并且尝试用上个小节学习的p v操作 也就是信号量机制来解决这个生产者消费者问题 问题的描…

基于GAN-CNN-CNN的鲁棒笔迹识别方法(三)

上一篇文章提出了一个用于笔迹识别(鉴别)的三段式模型,同时也提出了一个新数据集HTID_1,本文主要针对模型的最后一部分--笔迹识别,在HTID_1上进行实验. 数据集 实验前先介绍一下HTID_1. HTID_1是用于笔迹识别的数据集,是基于本文提出的模型制作而成的.将互联网上收集的740人笔…

Unity Shader 滚动进度条效果

Unity Shader 滚动进度条效果 前言项目场景布置导入图片修改场景设置修改图片尺寸即可调整进度 ASE连线 前言 UI要实现一个滚动进度&#xff0c;于是使用Shader制作一个。 项目 场景布置 导入图片 修改一下导入图片的格式&#xff0c;这样才能循环起来 WrapMode改为Repea…

2024/2/1学习记录

echarts 为柱条添加背景色&#xff1a; 若想设置折线图的点的样式&#xff0c;设置 series.itemStyle 指定填充颜色就好了&#xff0c;设置线的样式设置 lineStyle 就好了。 在折线图中倘若要设置空数据&#xff0c;用 - 表示即可&#xff0c;这对于其他系列的数据也是 适用的…

Windows11 用 HyperV 安装 Ubuntu-16.04 虚拟机

Windows11 用 HyperV 安装 Ubuntu-16.04 虚拟机 1. 确保已经开启HyperV2. 准备Ubuntu16.04镜像&#xff08;推荐64位的&#xff09;3. HyperV ->快速创建 -> 更改安装源 选刚刚下载的镜像&#xff08;.iso&#xff09;文件就好 -> 创建虚拟机[^1] 前提&#xff1a;VMw…