# 火题小战 A.玩个球
火题小战 A.玩个球
题目描述
给你 \(n\) 种颜色的球,每个球有 \(k\) 个,把这 \(n\times k\) 个球排成一排,把每一种颜色的最左边出现的球涂成白色(初始球不包含白色),求有多少种不同的颜色序列,答案对 \(10^9+7\) 取模。
数据范围
对于\(30\%\)的数据,\(N \leq 3,K \leq 3\);
对于\(50\%\)的数据,\(N \leq 300,K \leq 300\);
对于另外\(20\%\)的数据,\(N = 2\);
对于\(100\%\)的数据,\(N \leq 2000,K \leq 2000\); 。
分析
观察这一道题的数据范围,我们可以使用 \(n^2\) 的做法
一个比较容易得出的结论是,如果你从左向右数的话,那么白球的数量一定大于等于经你已选择的颜色种类数
因此,我们设 \(f[i][j]\) 为当前已经放置了 \(i\) 个白球和 \(j\) 种其它颜色的球的合法方案数
下面我们考虑转移
首先, \(f[i][j]\) 一定可以由 \(f[i-1][j]\) 转移过来
因为如果当前你已经放置了 \(i-1\) 个白球和 \(j\) 种其他颜色的球,那么你在后面再放一个白球是没有影响的
接下来我们考虑 \(f[i][j-1]\) 的转移
首先,当前已经选择了 \(j-1\) 种颜色的球,那么我们还有 \(i-j+1\) 种颜色没有选择
对于某一种颜色的球,如果我们选择了它,那么我们必须从中选出一个球放在最前面
这样可以避免重复的情况
此时,这一种颜色的球已经被选择了 \(1\) 个放在最前面,还有 \(1\) 个被涂成了白球
还剩下 \(k-2\) 个
我们只需要从剩下的 \(n \times k-i-1- (j-1) \times (k-1)\)中选择 \(k-2\) 个位置就可以
我们默认之前的 \(j-1\) 种颜色的球已经放好
因此递推式为
\]
最后注意一下 \(k=1\) 时的特判
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e9+7;
const int maxn=2005;
int f[maxn][maxn],ny[maxn*maxn],jc[maxn*maxn],jcc[maxn*maxn];
int getC(int n,int m){
return jc[n]*jcc[m]%mod*jcc[n-m]%mod;
}
signed main(){
int n,k;
scanf("%lld%lld",&n,&k);
if(k==1){
printf("1\n");
return 0;
}
ny[1]=1;
for(int i=2;i<=4000000;i++){
ny[i]=(mod-mod/i)*ny[mod%i]%mod;
}
jc[0]=1,jcc[0]=1;
for(int i=1;i<=4000000;i++){
jc[i]=jc[i-1]*i%mod;
jcc[i]=jcc[i-1]*ny[i]%mod;
}
for(int i=0;i<=n;i++) f[i][0]=1;
for(int i=1;i<=n;i++){
for(int j=0;j<=i;j++){
f[i][j]=f[i-1][j]%mod+f[i][j-1]%mod*(n-j+1)%mod*getC(n*k-i-1-(j-1)*(k-1),k-2)%mod;
}
}
printf("%lld\n",f[n][n]%mod);
return 0;
}
# 火题小战 A.玩个球的更多相关文章
- 火题小战 B. barbeque
火题小战 B. barbeque 题目描述 \(Robbery\) 是一个大吃货(雾) 某个神奇的串由牛肉和青椒构成,于是\(Robbery\)购买了\(n\)个餐包来自己做这个串,每个餐包中有一些牛 ...
- 火题小战 C. 情侣?给我烧了!
火题小战 C. 情侣?给我烧了! 题目描述 有 \(n\) 对情侣来到电影院观看电影.在电影院,恰好留有 \(n\) 排座位,每排包含 \(2\) 个座位,共 \(2×n\) 个座位. 现在,每个人将 ...
- Java基础知识强化之IO流笔记70:Properties练习之 如何让猜数字小游戏只能玩5次的案例
1. 使用Properties完成猜数字小游戏只能玩5次的案例: 2. 代码实现: (1)猜数字游戏GuessNumber: package cn.itcast_08; import java.uti ...
- [编程题] 小易喜欢的数列 dp
https://www.nowcoder.com/question/next?pid=6291726&qid=112729&tid=12736753 [编程题] 小易喜欢的数列 时间限 ...
- YTU 2960: 改错题--小鼠标,你要干什吗?
2960: 改错题--小鼠标,你要干什吗? 时间限制: 1 Sec 内存限制: 128 MB 提交: 118 解决: 62 题目描述 鼠标双击不同的图标产生不同的效果,比如双击文档(documen ...
- 从乐视和小米“最火电视”之战 看PR传播策略
今年的双11够热闹.一方面,阿里.京东.国美.苏宁等电商巨头卯足了劲儿.试图在双11期间斗个你死我活,剑拔弩张的气势超过了以往不论什么一场双11:还有一方面.不少硬件厂商.家电企业也来凑双11 ...
- 火题大战Vol.1 A.
火题大战Vol.1 A. 题目描述 给定两个数\(x\),\(y\),比较\(x^y\) 与\(y!\)的大小. 输入格式 第一行一个整数\(T\)表示数据组数. 接下来\(T\)行,每行两个整数\( ...
- 火题大战Vol.0 B 计数DP
火题大战Vol.0 B 题目描述 \(n\) 个沙茶,被编号 \(1\)~$ n$.排完队之后,每个沙茶希望,自己的相邻的两人只要无一个人的编号和自己的编号相差为 \(1\)(\(+1\) 或\(-1 ...
- 快速入门PaddleOCR,并试用其开发一个搜题小工具
介绍 PaddleOCR 是一个基于百度飞桨的OCR工具库,包含总模型仅8.6M的超轻量级中文OCR,单模型支持中英文数字组合识别.竖排文本识别.长文本识别.同时支持多种文本检测.文本识别的训练算法. ...
随机推荐
- Spring IoC深入理解
本文相关代码(来自官方源码spring-test模块)请参见spring-demysify org.springframework.mylearntest包下. 三种注入方式 1.构造方法注入 pub ...
- HBase面试考点
HBase 架构图 组成部分及作用 Zookeeper在HBase中作用 Master的高可用 RegionServer的监控 元数据的入口 HMaster 不仅有维护集群元数据信息的功能,还能 通过 ...
- Laragon修改配置快速创建其他框架的项目
配置方式 依葫芦画瓢,如添加thinkPHP: # Thinkphp Thinkphp 3.2=composer create-project topthink/thinkphp %s Thinkph ...
- Elasticsearch必知必会的干货知识二:ES索引操作技巧
该系列上一篇文章<Elasticsearch必知必会的干货知识一:ES索引文档的CRUD> 讲了如何进行index的增删改查,本篇则侧重讲解说明如何对index进行创建.更改.迁移.查询配 ...
- 可能会用的到的JQ插件
├─lib │ jquery jQuery类库(v1.9.1) │ bootstrapSwitch 开关控件 │ Hui-iconfont_v1.0 阿里图标字体库(H-ui定制) │ font-aw ...
- 预定义的 $_GET 变量用于收集来自 method="get" 的表单中的值
PHP $_GET 变量 在 PHP 中,预定义的 $_GET 变量用于收集来自 method="get" 的表单中的值. $_GET 变量 预定义的 $_GET 变量用于收集来自 ...
- PHP cal_from_jd() 函数
------------恢复内容开始------------ 实例 把儒略日计数转换为格利高里历法的日期: <?php$d=unixtojd(mktime(0,0,0,6,20,2007));p ...
- PHP xml_get_current_byte_index() 函数
定义和用法 xml_get_current_byte_index() 函数获取 XML 解析器的当前字节索引.高佣联盟 www.cgewang.com 如果成功,该函数则返回当前字节索引.如果失败,则 ...
- Ubuntu安装Cloudera Manager以及CDH5.15.2
一.机子分配 注意,本安装教程是在真机上进行,而非虚拟机.另,此次搭建主要的目的是搭建测试环境,让Hadoop各组件能够运作起来即可,完成搭建后,将用小数据量进行相关数据的计算与测试.线上环境将会使用 ...
- 7.9 NOI模拟赛 C.走路 背包 dp 特异性
(啊啊啊 什么考试的时候突然降智这题目硬生生没想出来. 容易发现是先走到某个地方 然后再走回来的 然后在倒着走的路径上选择一些点使得最后的得到的最多. 设\(f_{i,j}\)表示到达i这个点选择的价 ...