题目大意

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

  \(n,m\leq 2000\)

题解

  我们称颜色为\(1\sim n\)的球为正常颜色的球,颜色为\(n+1\)的球为白球。

  我们先钦定每种颜色最左边那个球的出现顺序为\(1\)~\(n\),从左往右的第\(i\)个白球的球对应着第\(i\)个颜色。

  考虑从后往前放,设当前序列最前面有\(x\)个白球的球,那么当前放的白球要放在最前面,其他\(m-1\)个正常颜色的球中最左边那个要放在当前最左边正常颜色的球的左边。剩下\(m-2\)个可以随便放。

  设\(f_{i,j}\)为放了后\(i\)种颜色的球,序列最前面有\(j\)个白球。

\[f_{i,j}=\sum_{k\geq j-1}f_{i-1,k}\times \binom{im-j-1}{m-2}
\]

  可以发现后面那个组合数和\(k\)无关,所以可以用后缀和优化

  时间复杂度:\(O(nm)\)

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
ll p=1000000007;
ll fac[4000010];
ll ifac[4000010];
ll inv[4000010];
void init(int n)
{
int i;
fac[0]=fac[1]=ifac[0]=ifac[1]=inv[0]=inv[1]=1;
for(i=2;i<=n;i++)
{
inv[i]=-(p/i)*inv[p%i]%p;
fac[i]=fac[i-1]*i%p;
ifac[i]=ifac[i-1]*inv[i]%p;
}
}
ll c(int x,int y)
{
if(x<y)
return 0;
return fac[x]*ifac[y]%p*ifac[x-y]%p;
}
ll f[2010][2010];
int main()
{
int n,k;
scanf("%d%d",&n,&k);
if(k<=1)
{
printf("1\n");
return 0;
}
init(n*k);
int i,j;
f[0][0]=1;
for(i=1;i<=n;i++)
for(j=n;j>=0;j--)
{
if(j<=i)
f[i][j]+=f[i-1][j-1]*c(k*i-j-1,k-2)%p;
f[i][j]=(f[i][j]+f[i][j+1])%p;
}
ll ans=(f[n][0]%p+p)%p;
ans=ans*fac[n]%p;
printf("%lld\n",ans);
return 0;
}

【AGC002F】Leftmost Ball DP 数学的更多相关文章

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

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

  2. AGC002 F Leftmost Ball——DP

    题目:https://atcoder.jp/contests/agc002/tasks/agc002_f 充要条件是前缀0的个数 >= 颜色种数. 设计 DP ,放一个颜色的时候就把所有该颜色的 ...

  3. AGC002F Leftmost Ball

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

  4. 【agc002f】Leftmost Ball(动态规划)

    [agc002f]Leftmost Ball(动态规划) 题面 atcoder 洛谷 题解 我们从前往后依次把每个颜色按顺序来放,那么如果当前放的是某种颜色的第一个球,那么放的就会变成\(0\)号颜色 ...

  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. 【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 ...

  8. # E. Mahmoud and Ehab and the xor-MST dp/数学+找规律+xor

    E. Mahmoud and Ehab and the xor-MST dp/数学/找规律 题意 给出一个完全图的阶数n(1e18),点由0---n-1编号,边的权则为编号间的异或,问最小生成树是多少 ...

  9. 2018.10.25 atcoder Leftmost Ball(计数dp+组合数学)

    传送门 dp妙题啊. 我认为DZYODZYODZYO已经说的很好了. 强制规定球的排序方式. 然后就变成了一个求拓扑序数量的问题. 代码: #include<bits/stdc++.h> ...

随机推荐

  1. Flask入门的第一个项目进阶版

    前言: 此次版本增加[一对多]数据库关系和动态路由设置. 一.数据库设计 environments表与variable1表的关系为:一对多.variable1.env_id设置为外键,与environ ...

  2. python_内置函数1_42

    内置函数 内置函数大全:     Built-in Functions     abs() dict() help() min() setattr() all() dir() hex() next() ...

  3. 使用fiddlercore修改网页的返回内容

    最近研究了一下FiddlerCore,发现这是个非常强大的工具.可以用来采集网页.修改网页数据.开发页游外挂等等. 使用这个工具,需要掌握一定的html和http知识,官方网站上也有例子可以下载. 看 ...

  4. 软工网络15团队作业4——Alpha阶段敏捷冲刺

    Deadline: 2018-4-29 10:00PM,以提交至班级博客时间为准. 根据以下要求,团队在日期区间[4.16,4.29]内,任选8天进行冲刺,冲刺当天晚10点前发布一篇随笔,共八篇. 另 ...

  5. Linux之磁盘挂载

    1.查看磁盘分区情况: fdisk -l 可以看到,红框中的硬盘没有分区. 2.开始分区: fdisk /dev/vdb 3.格式化分区: mkfs.xfs 分区名 4.挂载磁盘 挂载方式1: 手动挂 ...

  6. Jenkins [Error] at org.codehaus.cargo.container.tomcat.internal.AbstractTomcatManagerDeployer.redeploy(AbstractTomcatManagerDeployer.java:192)

    Deploying /root/.jenkins/workspace/zgg-crm-pre/target/crm.war to container Tomcat 7.x Remote with co ...

  7. js判断一个对象{}是否为空对象,没有任何属性

    // js如何判断一个对象{}是否为空对象,没有任何属性 if (typeof model.rows === "object" && !(model.rows in ...

  8. 12 Connections

    1 and 出现在两个及以上的词,词组,或者句子之间,将它们连接起来.在正式的书面英语中,and不能出现在句首.在非正式的英语中可以. We should expand our product lin ...

  9. [转帖]ODBC、OLEDB、ADO、ADO.NET

    一文详解ODBC.OLEDB.ADO.ADO.NET之间的关系 2019年01月16日 21:28:38 LoveMIss-Y 阅读数:66更多 所属专栏: 白话C#高级编程   版权声明:本文为博主 ...

  10. Notepad++的一个用法 转换为unix 格式的文件

    1. 跟昨天的linux 下面无法执行脚本的blog 一样 今天发现 notepad++ 有一个功能如下图: 双击 就能够选择文件的类型.. 转换为 unix 格式 就可以 在linux 下面执行了. ...