【agc002f】Leftmost Ball(动态规划)

题面

atcoder

洛谷

题解

我们从前往后依次把每个颜色按顺序来放,那么如果当前放的是某种颜色的第一个球,那么放的就会变成\(0\)号颜色,所以无论何时,\(0\)号颜色的数量不能少于其他颜色的数量。

可以设状态\(f[i][j]\)表示前面一共放了\(i\)个\(0\)号颜色的球,而一共出现了\(j\)种其他颜色的球,根据上面的东西,可以知道\(i\ge j\)。每次转移我们分成两种考虑。第一种就直接在后面接一个\(0\)号颜色的球,这个不需要考虑任何决策,直接转移即可,也就是\(f[i][j]+=f[i-1][j]\)。另外一种转移是选择一共新的颜色,抛去前面已经放好的\(0\)号颜色的前,抛去当前位置放下一个当前颜色的球,那么还需要在后面选择\(k-2\)个位置来放这些球,而后面剩下的空位个数显然是可以算的。首先还剩下\(n-i\)个\(0\)号颜色的球没有放,所以提供\(n-i\)个空位,前面一共只出现了\(j-1\)种颜色,所以还有\((n-j+1)*(k-1)\)个空位,但是当前的位置被钦定放这种新的颜色,所以还要减少一个位置。

也就是转移长成这个样子:

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

时间复杂度\(O(nk)\)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define ll long long
#define MAX 2010
#define MOD 1000000007
void add(int &x,int y){x+=y;if(x>=MOD)x-=MOD;}
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n,k,mx,f[MAX][MAX];
int jc[MAX*MAX],jv[MAX*MAX],inv[MAX*MAX];
int C(int n,int m){return 1ll*jc[n]*jv[m]%MOD*jv[n-m]%MOD;}
int main()
{
n=read();k=read();mx=n*k;
if(k==1){puts("1");return 0;}
jc[0]=jv[0]=inv[0]=inv[1]=1;
for(int i=1;i<=mx;++i)jc[i]=1ll*jc[i-1]*i%MOD;
for(int i=2;i<=mx;++i)inv[i]=1ll*inv[MOD%i]*(MOD-MOD/i)%MOD;
for(int i=1;i<=mx;++i)jv[i]=1ll*jv[i-1]*inv[i]%MOD;
f[0][0]=1;
for(int i=1;i<=n;++i)
for(int j=0;j<=i;++j)
{
add(f[i][j],f[i-1][j]);
if(j)add(f[i][j],1ll*f[i][j-1]*(n-j+1)%MOD*C((n-i)+(n-j+1)*(k-1)-1,k-2)%MOD);
}
printf("%d\n",f[n][n]);
return 0;
}

【agc002f】Leftmost Ball(动态规划)的更多相关文章

  1. AtCoder Grand Contest 002 (AGC002) F - Leftmost Ball 动态规划 排列组合

    原文链接https://www.cnblogs.com/zhouzhendong/p/AGC002F.html 题目传送门 - AGC002F 题意 给定 $n,k$ ,表示有 $n\times k$ ...

  2. AGC002F Leftmost Ball

    题目传送门 Description \(n\)种颜色的球,每种\(k\)个,\((n,k\leq 2000)\)将\(n\cdot k\)个球排成一排,把每种颜色最左边的那个涂成白色(初始不含白色), ...

  3. AtCoder AGC002F Leftmost Ball (DP、组合计数)

    题目链接: https://atcoder.jp/contests/agc002/tasks/agc002_f 题解: 讲一下官方题解的做法: 就是求那个图(官方题解里的)的拓扑序个数,设\(dp[i ...

  4. 【AGC 002F】Leftmost Ball

    Description Snuke loves colorful balls. He has a total of N*K balls, K in each of his favorite N col ...

  5. 【AtCoder】AGC022 F - Leftmost Ball 计数DP

    [题目]F - Leftmost Ball [题意]给定n种颜色的球各k个,每次以任意顺序排列所有球并将每种颜色最左端的球染成颜色0,求有多少种不同的颜色排列.n,k<=2000. [算法]计数 ...

  6. ATcoder 2000 Leftmost Ball

    Problem Statement Snuke loves colorful balls. He has a total of N×K balls, K in each of his favorite ...

  7. 【AGC002F】Leftmost Ball DP 数学

    题目大意 有\(n\)种颜色的球,每种\(m\)个.现在zjt把这\(nm\)个球排成一排,然后把每种颜色的最左边的球染成第\(n+1\)种颜色.求最终的颜色序列有多少种,对\(1000000007\ ...

  8. 【agc002f】Leftmost Ball

    题目大意 有n种颜色,每种k个球.将这些球任意排列,将每种颜色中最前面的一个求涂成白色(就是n+1种颜色),求最终的排列的方案的个数. 解题思路 考虑如何计算不会算重, 按颜色顺序,每次往排列插入k个 ...

  9. AGC002 F - Leftmost Ball

    貌似哪里讲过这题..总之当时掉线了(理解能力又差水平又低选手的日常).. 看看题目,应该是DP. 尝试了几次换状态,毫无思路.那我们就来继续挖掘性质吧...为了更直观,我们令第i个出现的球颜色就是i( ...

随机推荐

  1. Maven私有仓库-使用docker部署Nexus

    查看官方镜像说明 nexus2 nexus3 建议使用nexus2,可能网上的资料这个版本居多. 我选择的是nexus3,~~~ 启动容器 官方说明中提到的是使用docker直接启动.我选择用dock ...

  2. jquery方法简单记录

      append() - 在被选元素的结尾插入内容 prepend() - 在被选元素的开头插入内容 after() - 在被选元素之后插入内容 before() - 在被选元素之前插入内容 firs ...

  3. 2017-2018-2 20155224 『网络对抗技术』Exp9:Web安全基础

    实验完成情况 共完成11题 准备工作 在浏览器输入localhost:8080/WebGoat打开webgoat,左侧选择题目 右键选择Inspect Element开始调试 Injection Fl ...

  4. 20155307《网络对抗》Web安全基础实践

    20155307<网络对抗>Web安全基础实践 基础问题回答 SQL注入攻击原理,如何防御? 原理:SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL ...

  5. 全虚拟化和半虚拟化的区别 cpu的ring0 ring1又是什么概念? - 转

    http://www.cnblogs.com/xusongwei/archive/2012/07/30/2615592.html ring0是指CPU的运行级别,ring0是最高级别,ring1次之, ...

  6. 【干货】YUM安装PHP 7版本后,增加phalcon框架的报错解决

    目录 1.yum安装php 7.x版本,此处部署7.3版本 2.安装phalcon框架 2.1.PHP版本依赖关系 2.2.编译phalcon扩展模块 2.3.增加扩展文件 3.部署phalcon遇到 ...

  7. Security4:授予查看定义,执行SP和只读数据的权限

    SQL Server数据库有完善的权限管理机制,对于存储过程,其权限分为查看定义,执行和修改,查看SP定义的权限是:VIEW DEFINITION ,执行存储过程的权限是:EXECUTE,修改SP的权 ...

  8. SpringBoot入门学习记录(一)

    最近,SpringBoot.SpringCloud.Dubbo等框架非常流行,作为Coder里的一名小学生,借着改革开放的东风,自然也是需要学习学习的,于是将学习经历记录于此,以备日后查看. 官网:h ...

  9. python 微信撤回消息

    import itchatfrom itchat.content import *import osimport reimport time# 文件临时存储页rec_tmp_dir = os.path ...

  10. 172. Remove Element【LintCode by java】

    Description Given an array and a value, remove all occurrences of that value in place and return the ...