贴一个和其他题解不一样的做法 QWQ

题意:让我们求出 N 个球放入 R 个盒子且每个盒子都必须放球方案数。

首先,对于每一个球,可以将其放入的盒子数量共有 R 个,所以我们可以知道如果无需满足每个盒子都必须放球时的方案数共有 R^N 种方案数(球任意放,允许有空盒子)。

如果我们要满足题目给定的限制条件怎么办呢?

先定义 F[i] 为将 N 个球放入 i 个盒子且每个盒子都必须放球的方案数。

考虑要求每个 F[i],我们只需要把球任意放且允许有空盒子的方案数减去有一个空盒子,有两个空盒子到有 i-1 个空盒子的方案数之和,并将每个减数项乘上其对应的组合数,即表示在 i 个盒子中选取 j (1<j<i) 个盒子空着的方案总数 C(i,j) 乘以在 j 个盒子里放 R 个球的方案数。(在高中组合数学中称为间接法)。

可以得到状态转移方程:

\(F[i] = i^N - (C^1_i*F[1] + C^2_i*F[2]+…+C^k_i*F[k])\)

其中:\(k=i-1\)

可以写出代码:

#include <bits/stdc++.h>
#define N 17
#define ll long long
using namespace std;
int n,r;
ll f[N],C[N][N];
ll quick_pow(ll a,ll b) //快速幂
{
ll ret=1;
while (b)
{
if (b&1) ret*=a;
a*=a;
b>>=1;
}
return ret;
}
int main()
{
scanf("%d%d",&n,&r); for (int i=0;i<=n;i++) C[0][i]=1;
for (int i=1;i<=n;i++)
for (int j=1;j<=i;j++)
C[j][i]=C[j-1][i-1]+C[j][i-1];
//预处理组合数
for (int i=1;i<=n;i++)
{
f[i]=quick_pow(i,n); //计算 i^n
for (int j=1;j<i;j++) f[i]-=C[j][i]*f[j]; //逐项减去
}
printf("%lld",f[r]);
return 0;
}

时间复杂度 Θ(n^2)

Luogu1287 | 盒子与球 (排列组合)的更多相关文章

  1. 数学(组合,容斥):COGS 1220. 盒子与球

    1220. 盒子与球 ★   输入文件:boxball.in   输出文件:boxball.out   简单对比 时间限制:1 s   内存限制:128 MB [问题描述] 现有r个互不相同的盒子和n ...

  2. 排列组合+组合数取模 HDU 5894

    // 排列组合+组合数取模 HDU 5894 // 题意:n个座位不同,m个人去坐(人是一样的),每个人之间至少相隔k个座位问方案数 // 思路: // 定好m个人 相邻人之间k个座位 剩下就剩n-( ...

  3. 洛谷 题解 P1287 【盒子与球】

    题解:P1287 盒子与球 不了解的:stirling数(斯特林数) - 百度百科 分析如下: 设有n个不同的球,分别用b1,b2,--bn表示.从中取出一个球bn,bn的放法有以下两种: 1) bn ...

  4. HDU 1521 排列组合 指数型母函数

    排列组合 Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit Status D ...

  5. Codeforces Round #309 (Div. 2) C. Kyoya and Colored Balls 排列组合

    C. Kyoya and Colored Balls Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contes ...

  6. 数组排列组合问题——BACKTRACKING

    BACKTRACKING backtracking(回溯法)是一类递归算法,通常用于解决某类问题:要求找出答案空间中符合某种特定要求的答案,比如eight queens puzzle(将国际象棋的八个 ...

  7. POJ1644状态转移的思想——排列组合

    m个物品放n个盒子,盒子物品都相同,问你放的方法总数是多少 看着像个排列组合,算着算着就发现我排列组合都忘得差不多啦,哎,什么时候能打败遗忘呢 然后想用dp做,但是转移的方面没有想好 看了看题解感觉这 ...

  8. 【专题】计数问题(排列组合,容斥原理,Prufer序列)

    [容斥原理] 对于统计指定排列方案数的问题,一个方案是空间中的一个元素. 定义集合x是满足排列中第x个数的限定条件的方案集合,设排列长度为S,则一共S个集合. 容斥原理的本质是考虑[集合交 或 集合交 ...

  9. 51nod1453(排列组合)

    题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1453 题意: 中文题诶~ 思路: 因为最后一个球总是在编号比 ...

随机推荐

  1. 来去学习之---KMP算法--next计算过程

    一.概述 KMP算法是一种字符串匹配算法,比如现有字符串 T:ABCDABCDABCDCABCDABCDE, P:ABCDABCDE P字符串对应的next值:[0,0,0,0,1,2,3,4,0] ...

  2. Python面试(网编+数据库)

    第一部分 必答题 简述 OSI 7层模型及其作用?(2分) 应用层:与用户直接交互,软件.网站等 表示层:使用软件.网站可以查看的数据,图片等 会话层:保持登录状态,电脑中为cookie 传输层:选择 ...

  3. 前端的Cookies

    Cookies cookies 特性 前端数据存储 后端通过 HTTP 头设置 请求时通过 HTTP 头传给后端 前端可读可写 遵守同源策略 域名 有效期 路径 http-only secure(ht ...

  4. mysql 报错:Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. To disable safe mode, toggle the option in Preferences

    目录 #事故现场 #解决方法 #事故现场 mysql执行update操作报错: sql如下: update psmp.Users set name='Jack' where name='Lily'; ...

  5. [Contract] Solidity 变量类型的默认值

    变量的默认值一般都代表 “零值”. 比如 bool 就是 false,uint.int 就是 0,string 就是空字符串. 其它组合的参考 Solidity 判断 mapping 值的存在 Ref ...

  6. [Contract] Solidity 遍历 mapping 的一种方式

    思路:为需要遍历的 mapping 再准备一个 list,之后通过 for 循环遍历 list 取得 mapping 的 key. mapping (address => uint) users ...

  7. 【01】HTML_day01_02-认识HTML

    typora-copy-images-to: media 第01阶段.前端基础.认识HTML 学习目标 理解 HTML的概念 HTML标签的分类 HTML标签的关系 HTML标签的语义化 应用 HTM ...

  8. myeclipse 2018 intaslled jars JREs 选项区别,及注意事项

    Standard 1.1.x VM与Standard VM的区别 在Eclipse或MyEclipse中要设置Installed JREs时,有三个选择: - Execution Environmen ...

  9. sqlserver 批量修改数据库表主键名称为PK_表名

    1.我们在创建sqlserver得数据表的主键的时候,有时会出现,后面加一串随机字符串的情况,如图所示: 2.如果你有强迫症的话,可以使用以下sql脚本进行修改,将主键的名称修改为PK_表名. --将 ...

  10. 在Oracle中使用sqlload做数据迁移

    前提:检查sqlload是否可用,输入sqlldr,提示有版本即可   1.创建测试表(已有则跳过)create table testTable(user varchar2(255),name var ...