首页 > 其他分享 >(容斥原理例题)洛谷P1287 盒子与球

(容斥原理例题)洛谷P1287 盒子与球

时间:2024-03-17 10:32:00浏览次数:13  
标签:方案 洛谷 int 小球 至少 容斥 qmi 盒子 例题

题目链接

点击此处前往

题目思路

标题就不难知道,这是一道关于容斥原理的题目

只需要简单一想就不难发现,这道题很可能会有很多重复的情况,就比如说我原来想的一个思路,先找出 r 个球来铺满第一层,然后再排列剩下的小球,这就会有很多重复的情况,比如说第一层的去了第二层,但是只是上下顺序变了但是总体顺序没变,这就造成了重复的情况

那么我们不妨反过来想

n 个小球放到 r 个盒子里一共有多少种放法呢?

一想就能想到
方案数 = r n 方案数 = r^n 方案数=rn
因为每个小球都有r个盒子可以放,所有就是n个r相乘

那么至少一个盒子是空着的呢?

结果也是显而易见的
方案数 = C r 1 ∗ ( r − 1 ) n 方案数 = C_r^1 * (r - 1)^n 方案数=Cr1​∗(r−1)n
一共有r个盒子,并且互不相同,所以哪个是空的不确定,由于是至少一个盒子是空的,所以就是每个小球有r-1个盒子可以放,也就是n个r-1相乘

这个时候你应该就能发现后面的规律了

至少o个盒子是空着的情况就是
方案数 = C r o ∗ ( r − o ) n 方案数 = C_r^o * (r - o)^n 方案数=Cro​∗(r−o)n
但是此时的你可能还不是很理解要干嘛

不是这样还是有很多重复的情况吗?

这里就涉及到了一个重要的组合数学原理,容斥原理

定义:若A和B是具有性质P1和性质P2的有限集合

那么 A ∪ B = A + B − A ∩ B A ∪ B = A + B - A ∩ B A∪B=A+B−A∩B

同理可得 $A ∪ B ∪ C = A + B + C - A ∩ B - A ∩ C - B ∩ C + A ∩ B ∩ C $

通俗易懂的来说接下来的步骤就是用总情况, 减去 至少有一个的时候, 加上 至少有2个的时候 。。。。。。

再解释一下就是减去所有至少有一个的情况的时候,就多减去了很多至少有2个的时候,加上的时候又加上了很多至少有三个的情况,以此类推

那么剩下的就是组合数学的基础部分,快速幂就不展开了,组合数由于范围非常小,如果又不理解的朋友可以转去看我的这篇文章

(组合数的计算)牛客周赛 Round 35 小红的子序列权值和 (easy / hard)

总代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 15;
int n,r;
int C[N][N];
int init()
{
	for(int i=0;i<N;i++){
		for(int j=0;j<=i;j++){
			if(!j) C[j][i] = 1;
			else C[j][i] = C[j-1][i-1] + C[j][i-1];
		}
	}
}
int qmi(int a,int b)
{
	int res = 1;
	while (b){
		if(b & 1) res *= a;
		a *= a;
		b >>= 1;
	}
	return res;
}
signed main()
{
	init();
	cin >> n >> r;
	int o = qmi(r,n);
	for(int i=1;i<r;i++){
		if(i & 1){
			o -= C[i][r] * qmi(r-i,n);
		}else{
			o += C[i][r] * qmi(r-i,n);
		}
	}
	cout << o << endl;
}

标签:方案,洛谷,int,小球,至少,容斥,qmi,盒子,例题
From: https://blog.csdn.net/hiphipsir1/article/details/136768517

相关文章

  • 二维前缀和知识讲解+例题
    1.二维前缀和二维前缀和是一种数组处理技术,它在处理二维数据(如矩阵)时非常有用。它的概念源自于一维前缀和,但扩展到了两个维度。二维前缀和的主要思想是将矩阵中的每个元素与其上方和左方的元素进行累加,从而快速计算出矩阵中任意子矩阵的元素和。定义如下:设有一个二维矩阵......
  • 洛谷P1097 [NOIP2007 提高组] 统计数字
    #先看题目题目描述某次科研调查时得到了n 个自然数,每个数均不超过1.5×109。已知不相同的数不超过 个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。输入格式共n+1 行。第一行是整数n,表示自然数的个数;第 2至n+1 每行一个自......
  • P1116 车厢重组 洛谷
    附加AC代码噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢哦哦哦!#车厢重组##题目描述在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转。一个车站的职工发现桥的长度最多能容纳两节车厢,如果将桥旋转180 度,则可以把相邻两节车厢的位置交换,用这种方法可以重新排列车......
  • 【C++算法模板】图论-拓扑排序,超详细注释带例题
    文章目录0)概述1)Kahn算法1:数据结构2:建图3:Kanh算法2)DFS染色1:数据结构2:建图3:DFS3)算法对比【例题】洛谷B3644推荐视频链接:D01拓扑排序0)概述给定一张有向无环图,排出所有顶点的一个序列A......
  • KMP字符串(解释+例题)
    题目描述:  思路: 数据结构KMP算法配图详解(超详细)_kmp算法流程图-CSDN博客AcWing831.字符串查找---用16幅图从暴力一步步优化到KMP-AcWing推荐以上两篇大佬的文章kmp算法步骤(p子串和s串下标从1开始):1、kmp匹配过程首先需要了解什么是前缀和后缀(只针对p子串去......
  • 洛谷 P2241 统计方形(数据加强版)
    一些文字说明 我们首先来定义一个东西,在我这里,矩形的长是指横向的边的长度,宽是指纵向的边的长度,宽可以比长还长。 由题意可知,题目要求我们求出在一个m*n的矩形中求出其包含的长方形的数量和正方形的数量,而长方形和正方形都是矩形,那么我们就是要求其包含的矩形的数量,可以......
  • 洛谷题解 - B3850 [GESP202306 四级] 幸运数
    目录题目描述输入格式输出格式样例#1样例输入#1样例输出#1代码题目描述小明发明了一种“幸运数”。一个正整数,其偶数位不变(个位为第111位,十位为第......
  • 洛谷题单指南-二叉树-P1030 [NOIP2001 普及组] 求先序排列
    原题链接:https://www.luogu.com.cn/problem/P1030题意解读:已知中序、后序,求先序。解题思路:与洛谷题单指南-二叉树-P1827[USACO3.4]美国血统AmericanHeritage非常类似,不在介绍过程,直接给出代码。100分代码:#include<bits/stdc++.h>usingnamespacestd;stringin,post......
  • 洛谷 P5018 对称二叉树
    题目背景NOIP2018普及组T4题目描述一棵有点权的有根树如果满足以下条件,则被轩轩称为对称二叉树:二叉树;将这棵树所有节点的左右子树交换,新树和原树对应位置的结构相同且点权相等。下图中节点内的数字为权值,节点外的 idid 表示节点编号。现在给出一棵二叉树,希望你找出......
  • 洛谷 B3625 迷宫寻路
    本道题需要注意:如果孩子的起始位置就是‘#’,那孩子就无路可走,出不来了。所以需要特判一下,代码如下:(这是废话,不需要特判,注意题目要求)if(ch[1][1]=='#'){ printf("No\n"); }注意边界条件:if(nx<1||nx>n||ny<1||ny>m){ continue; } if(vis[nx][ny]==1){ cont......