贴一个和其他题解不一样的做法 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. Shiro -- (二) 身份验证基本流程

    简介: 在 shiro 中,用户需要提供 principals (身份)和 credentials(证明)给 shiro,从而应用能验证用户身份: principals:身份,即主体的标识属性,可以是 ...

  2. 【C#】写文件时如何去掉编码前缀

    我们都知道,文件有不同的编码,例如我们常用的中文编码有:UTF8.GK2312 等. Windows 操作系统中,新建的文件会在起始部分加入几个字符的前缀,来识别编码. 例如,新建文本文件,写入单词 ...

  3. 简化MVVM属性设置和修改 - .NET CORE(C#) WPF开发

    微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. 简化MVVM属性设置和修改 - .NET CORE(C#) WPF开发 阅读导航 常用类属性设 ...

  4. 深入源码分析SpringMVC执行过程

    本文主要讲解 SpringMVC 执行过程,并针对相关源码进行解析. 首先,让我们从 Spring MVC 的四大组件:前端控制器(DispatcherServlet).处理器映射器(HandlerM ...

  5. 避免XSS攻击

    遭遇XSS攻击怎么解决 XSS的攻击手段 利用JavaScript或DOM方式进行攻击,XSS(脚本注入)提交,然后进行页面展示,影响页面的正常结构,还可以做钓鱼网站,来盗取用户的信息. 比如在页面评 ...

  6. Oracle行结果合计的实现

    Oracle行结果合计的实现,主要应用于日期结果的集计,下面是具体的实现代码. With AA as ( select 'A' tNo ,  10 B from dual union select ' ...

  7. Policy-based Approach(基于策略的方法)

    step 1:Neural Network as Actor step 2:goodness of function(训练一些Actor) 是一个序列,包含T个状态s.行为a.奖励s.代表某一次的开始 ...

  8. docker笔记(2)

    docker笔记(2) 常用命令和操作 1. 镜像操作 操作 命令 说明 检索 docker search 关键字 eg:docker search redis 我们经常去docker hub上检索镜 ...

  9. android中关于时间的控件

    1.日期选择器 <DatePicker android:layout_width="wrap_content" android:layout_height="wra ...

  10. AGC011-C Squared Graph

    题意 给定一个\(n\)个点\(m\)条边的图,构建一个\(n^2\)个点的图,新图的每个点都可以看成一个二元组,新图上的点\((a,b)和(a′,b′)\)之间有边,当且仅当原图中\((a,a′), ...