火题小战 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\) 种颜色的球已经放好

因此递推式为

\[f[i][j]=f[i-1][j]+f[i][j-1] \times (n-j+1) \times C_{n*k-i-1-(j-1)*(k-1)}^{k-2}
\]

最后注意一下 \(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.玩个球的更多相关文章

  1. 火题小战 B. barbeque

    火题小战 B. barbeque 题目描述 \(Robbery\) 是一个大吃货(雾) 某个神奇的串由牛肉和青椒构成,于是\(Robbery\)购买了\(n\)个餐包来自己做这个串,每个餐包中有一些牛 ...

  2. 火题小战 C. 情侣?给我烧了!

    火题小战 C. 情侣?给我烧了! 题目描述 有 \(n\) 对情侣来到电影院观看电影.在电影院,恰好留有 \(n\) 排座位,每排包含 \(2\) 个座位,共 \(2×n\) 个座位. 现在,每个人将 ...

  3. Java基础知识强化之IO流笔记70:Properties练习之 如何让猜数字小游戏只能玩5次的案例

    1. 使用Properties完成猜数字小游戏只能玩5次的案例: 2. 代码实现: (1)猜数字游戏GuessNumber: package cn.itcast_08; import java.uti ...

  4. [编程题] 小易喜欢的数列 dp

    https://www.nowcoder.com/question/next?pid=6291726&qid=112729&tid=12736753 [编程题] 小易喜欢的数列 时间限 ...

  5. YTU 2960: 改错题--小鼠标,你要干什吗?

    2960: 改错题--小鼠标,你要干什吗? 时间限制: 1 Sec  内存限制: 128 MB 提交: 118  解决: 62 题目描述 鼠标双击不同的图标产生不同的效果,比如双击文档(documen ...

  6. 从乐视和小米“最火电视”之战 看PR传播策略

        今年的双11够热闹.一方面,阿里.京东.国美.苏宁等电商巨头卯足了劲儿.试图在双11期间斗个你死我活,剑拔弩张的气势超过了以往不论什么一场双11:还有一方面.不少硬件厂商.家电企业也来凑双11 ...

  7. 火题大战Vol.1 A.

    火题大战Vol.1 A. 题目描述 给定两个数\(x\),\(y\),比较\(x^y\) 与\(y!\)的大小. 输入格式 第一行一个整数\(T\)表示数据组数. 接下来\(T\)行,每行两个整数\( ...

  8. 火题大战Vol.0 B 计数DP

    火题大战Vol.0 B 题目描述 \(n\) 个沙茶,被编号 \(1\)~$ n$.排完队之后,每个沙茶希望,自己的相邻的两人只要无一个人的编号和自己的编号相差为 \(1\)(\(+1\) 或\(-1 ...

  9. 快速入门PaddleOCR,并试用其开发一个搜题小工具

    介绍 PaddleOCR 是一个基于百度飞桨的OCR工具库,包含总模型仅8.6M的超轻量级中文OCR,单模型支持中英文数字组合识别.竖排文本识别.长文本识别.同时支持多种文本检测.文本识别的训练算法. ...

随机推荐

  1. C#数据结构与算法系列(二十三):归并排序算法(MergeSort)

    1.介绍 归并排序(MergeSort)是利用归并的思想实现的排序方法,该算法采用经典的分治策略(分治法将问题分(divide)成一些小的问题然后递归求解, 而治(conquer)的阶段则将分的阶段得 ...

  2. react 实战:写一个年份选择器

    上代码. 组件的Js文件. import React, { Component } from "react"; import Style from './myYearSelect. ...

  3. Captura - 免费好用还开源的录屏软件

    首先下载这个软件,国内下载很慢这里提供一个国内下载UCloud-OSS 软件打开后默认英文,现在我们切换到中午模式 在录制屏幕的同时获取声音

  4. 面试题四十二:连续子数组的最大和,要求时间复杂度为 n

    方法一:举例分析数组的规律,累加数组逐步保存最大值:累加中和<0,则遗弃前面的累加和:重新开始: int FindMaxArray(int [] A) {               if(A= ...

  5. 800页的《数据随想录》PDF版电子书|百度网盘免费下载|数据科学领域必读

    百度网盘免费下载|<数据随想录> 提取码:51y7 本电子书内容包含从数据埋点到数据可视化整个链条的内容,同时,也整理了很多小伙伴们在交流社区中常问到的问题<数据百问>系列 数 ...

  6. Python元组内置函数

    Python元组内置函数: len(元组名): 返回元组长度 # len(元组名): # 返回元组长度 tuple_1 = (1,2,3,'a','b','c') print("tuple_ ...

  7. == 和 is 的区别

    import copy a = ['a','b','c'] b = a #b和a引用自同一块地址空间 print("a==b :",a==b) print("a is b ...

  8. Python os.fsync() 方法

    概述 os.fsync() 方法强制将文件描述符为fd的文件写入硬盘.在Unix, 将调用fsync()函数;在Windows, 调用 _commit()函数.高佣联盟 www.cgewang.com ...

  9. PHP array_walk_recursive() 函数

    实例 对数组中的每个元素应用用户自定义函数: <?phpfunction myfunction($value,$key){echo "The key $key has the valu ...

  10. luogu P4724 模板 三维凸包

    LINK:三维凸包 一个非常古老的知识点.估计也没啥用. 大体上了解了过程 能背下来就背下来吧. 一个bf:暴力枚举三个点 此时只需要判断所有的点都在这个面的另外一侧就可以说明这个面是三维凸包上的面了 ...