【No.21】蓝桥杯组合数学|数位排序|加法计数原理|乘法计数原理|排列数|组合数|抽屉原理|小蓝吃糖果|二项式定理|杨辉三角|归并排序(C++)

该博客围绕蓝桥杯相关题目,介绍组合数学知识,包括数位排序、计数原理(加法、乘法原理)、排列数、组合数等。还讲解鸽巢原理、二项式定理和杨辉三角,给出多道例题的解题思路,如分割立方体、糊涂人寄信等,最后提及归并排序算法。

组合数学

数位排序

【问题描述】
小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。
例如,2022 排在 409 前面, 因为 2022 的数位之和是 6,小于 409 的数位 之和 13。又如,6 排在 2022 前面,因为它们的数位之和相同,而6小于 2022
给定正整数 n,m,请问对1到n 采用这种方法排序时,排在第 m 个的元 素是多少?
【输入格式】
输入第一行包含一个正整数 n。
第二行包含一个正整数 m 。
【输出格式】
输出一行包含一个整数,表示答案。

题目详解

对于数字 1-n 而言,可以事先求出每个数字的数位之和。根据每个数字的数位之和自定义排序函数即可。

代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 10;
int a[maxn], b[maxn];

//自定义排序函数
bool cmp(int x, int y)
{
	return b[x] < b[y] || b[x] == b[y] && x < y;
}

int main()
{
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; i ++)
	{
		//求i的数位之和
		int num = i;
		while (num)
			b[i] += num % 10;
			num /= 10;
			a[i] = i;
	}
	sort(a + 1, a + 1 + n, cmp);
	cout << a[m] << endl;
	return 0;
}

计数原理:加法原理

  • 加法原理: 集合 S 被分成两两不相交的部分 S1​,S2​,S3​,…,Sm​,那么 S 的对象数目等于:∣S∣=∣S1​∣+∣S2​∣+∣S3​∣+…+∣Sm​∣

  • 例: 一个学生想学一门数学课,一门文化课,但不能同时选,现在从 4 门数学课和 4 门文化课中选,一共有 4+4=8 种方法选一门课。

  • 加法原理的关键是将计数分解为若干个独立(不相容)的部分,保证既不重复也不遗漏地进行计数。

  • 加法原理是利用完备事件组的一个体现,我们可以利用一个集合的补集做题。

例题:分割立方体 lanqiaoOJ 题号 1620

题目描述:
一个立方体,边长为 n,分割成 n×n×n 个单位立方体。任意两个单位立方体,或者有 2 个公共点,或者有 4 个公共点,或者没有公共点。
请问,没有公共点和有 2 个公共点的立方体,共有多少对?
输入描述:
一个整数 n,1≤n≤30
思路:
反过来计算,先算出有 4 个公共点的立方体有多少对,然后用总对数减去。分几种情况讨论:

  1. 正方体和周围 3 个正方体相邻,这种情况共有 8 个,就是顶角上的 8 个,总个数 3×8;
  2. 正方体和周围 4 个正方体相邻,这种情况共有 (n−2)×12 个 (棱)总个数 4×(n−2)×12;
  3. 正方体和周围 5 个正方体相邻,这种情况共有 6×(n×n−4×n+4) 个,总个数 5×6×(n×n−4×n+4);
  4. 正方体和周围 6 个正方体相邻,这种情况共有 (n×n×n−n×n×6+n×12−8) 个,总个数 6×(n×n×n−n×n×6+n×12−8); 最后把这 44 个情况求和再除以 2。

正方体一共 n3n^3n3 个,共有 n3(n3−1)2\frac{n^3(n^3-1)}{2}2n3(n31)​ 种关系

  1. 正方体和周围 3 个正方体相邻,总个数 3×8;
  2. 正方体和周围 4 个正方体相邻,总个数 4×(n−2)×12;
  3. 正方体和周围 5 个正方体相邻,总个数 5×6×(n×n−4×n+4);
  4. 正方体和周围 66 个正方体相邻,总个数 6×(n×n×n−n×n×6+n×12−8);
  5. 最后把这 4 个情况求和再除以 2。
#include<bits/stdc++.h>
using namespace std;
int main()
{
   
   
    int n; 
    cin >> n;
    if(n == 1)
    {
   
                // 边长为 1 时特判
        cout << 0 << endl;
        return 0;
    }
    long long sum = n * n * n * (n * n * n - 1) / 2; //总数
    int edge3 = 8;
    int ans3 = 3 * edge3;
    int edge4 = (n - 2) * 12;
    int ans4 = 4 * edge4;
    int edge5 = n * n - 4 * n + 4;
    int ans5 = 5 * 6 * edge5;
    int edge6 = n * n * n - n * n * 6 + n * 12 - 8;
    int ans6 = 6 * edge6;
    cout << sum - (ans3 + ans4 + ans5 + ans6) / 2 << endl;
    return 0;
}

计数原理:乘法原理

令 S 是对象的有序对 (a,b) 的集合,其中第一个对象 a 来自大小为 p 的一个集合,对于对象 a 的每个选择,对象 b 有 q 个选择,那么 S 的大小:∣S∣=p×q
例:中性笔的长度有 3 种,颜色有 4 种,直径有 5 种。不同种类的中性笔有:3×4×5=60 种。
例:34∗55∗72∗1133^4*5^5*7^2*11^3345572113 的正整数因子有多少?答:这是算数基本定理的概念。3 有 0 ~ 4 这 5 种选择,5 有 6 个选择,7 有 3 个选择,11 有 4 个选择,因子总数是 5×6×3×4=360 种。

排列数

排列是有序的。
不可重复排列数:从 n 个不同的物品中取出 r 个,排列数为:
Anr=n(n−1)(n−2)…(n−r+1)=n!(n−r)! A_{n}^{r}=n(n-1)(n-2)\dots (n-r+1)=\frac{n!}{(n-r)!} Anr=n(n1)(n2)(nr

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值