貌似哪里讲过这题。。总之当时掉线了(理解能力又差水平又低选手的日常)。。

看看题目,应该是DP。

尝试了几次换状态,毫无思路。那我们就来继续挖掘性质吧。。。为了更直观,我们令第i个出现的球颜色就是i(最后乘个阶乘就成)。那么有:

1122->0102

13223312->00203312

122132441231344->002102041231344

我们发现,i个0将序列分成i段,第i段的数字由1...i组成。考虑从1到n依次塞数字,数字i要塞在第i个0后面,因此会有这样的现象。我们尝试DP这个过程。我们发现,从1开始DP将非常恶心,因为前面的数字会影响后面数字的可摆放区间。也就是说,小数字会影响大数字,但大数字却不会影响小数字。于是我们考虑倒过来DP,这就非常舒服了,在放数字i时,第i个白球后面的球个数一定为(n-i)*k个,于是我们就可以愉快组合数了!结案!

如果直接这样写,那么样例都过不去。。。比如样例中的0021,可以认为出现顺序为1,2,也可以认为出现顺序为2,1。

因此,除白球外 第1个i球也要放在第1个i+1球前面 否则将当i球、i+1球的实际颜色交换时,该方案会被重复计算。因此,我们要多记一维第一个i球的位置。这个位置必定是直接跟在一串白球后的,所以我们可以这样设计:

令f[i][j]表示已放完第i...n个球,第i个球前有j个白球的方案数。

那么有 f[i][j]=f[i+1][j...n]*C(n-j+(n-i+1)*(k-1)-1,k-2))

前缀和优化一下就好了!

(注意,当k=1时要特判,直接输出1即可)

最喜欢这种代码特别短的题了

 #include <bits/stdc++.h>
using namespace std; #define rep(i,l,r) for(int i=l;i<=r;++i)
#define per(i,r,l) for(int i=r;i>=l;--i) typedef long long ll; const int N=,NN=5e6;
const ll p=1e9+; int n,k;
ll jc[NN+],njc[NN+],f[N][N],g[N][N]; ll ksm(ll x,ll w){
ll ans=;
while(w){
if(w&1ll) (ans*=x)%=p;
(x*=x)%=p;
w>>=;
}
return ans;
} ll C(ll a,ll b){
return (jc[a]*njc[b]%p)*njc[a-b]%p;
} int main(){
scanf("%d%d",&n,&k); if(k==){
printf("1\n");
return ;
} jc[]=njc[]=;int L=5e6;
rep(i,,L) jc[i]=(jc[i-]*i)%p;
rep(i,,L) njc[i]=ksm(jc[i],p-); rep(j,,n) g[n][j]=;f[n][n]=;
per(i,n-,){
rep(j,i,n)
f[i][j]=(g[i+][j]*C(n-j+(n-i+)*(k-)-,k-))%p;
per(j,n,) g[i][j]=(g[i][j+]+f[i][j])%p;
} ll ans=;
rep(i,,n) (ans+=f[][i])%=p;
(ans*=jc[n])%=p; printf("%lld\n",ans); return ;
}

AGC002 F - Leftmost Ball的更多相关文章

  1. AGC002 F Leftmost Ball——DP

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

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

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

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

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

  4. Atcoder Grand Contest 002 F - Leftmost Ball(dp)

    Atcoder 题面传送门 & 洛谷题面传送门 这道 Cu 的 AGC F 竟然被我自己想出来了!!!((( 首先考虑什么样的序列会被统计入答案.稍微手玩几组数据即可发现,一个颜色序列 \(c ...

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

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

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

  7. ATcoder 2000 Leftmost Ball

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

  8. AtCoder Grand Contest 002 F:Leftmost Ball

    题目传送门:https://agc002.contest.atcoder.jp/tasks/agc002_f 题目翻译 你有\(n*k\)个球,这些球一共有\(n\)种颜色,每种颜色有\(k\)个,然 ...

  9. [AT2000] [agc002_f] Leftmost Ball

    题目链接 AtCoder:https://agc002.contest.atcoder.jp/tasks/agc002_f 洛谷:https://www.luogu.org/problemnew/sh ...

随机推荐

  1. php不用正则表达式实现身份证号验证详解

    写了一个身份证号验证类,php小白,写的不好,欢迎各位大神给我多提意见和建议 身份证号分为四部分,第一部分是前6位为地址码,7-14位是出生日期,15-17位是同一地方同一天出生的男孩为奇数,女孩是偶 ...

  2. ssh整合报错严重: Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'xxx'

    错误描述:eclipse整合ssh的时候 报不能创建名字为xxx的对象 信息: Destroying singletons in org.springframework.beans.factory.s ...

  3. 掩码图制作----c语言贴图

    1.首先你得有一张图,比如这样的: 2.用PS打开他... 3.左边工具栏里(快速选择工具W),选想显示的部分 4.ctrl+c复制一下,新建一张黑底图粘贴上去或者白底图时选中显示区即花瓣右键反向右键 ...

  4. 在用单片机接受串口数据的时候,第一位是0x0A

    unsigned char data len=0; //命令字符串长度if(RI) //如果数据已经接收完,即RI=1{ RI=0; //对RI进行清零 cmd_buf[counter] = SBUF ...

  5. 用usecase获取需求的方法是否有缺陷,还有什么地方需要改进

    usecase的局限性 对于系统发展而言,Use Case的范围限制一个单一的系统,这是Use Cases最通常的形式,我们称之为System Use Case,它把整个系统看作是一个黑盒,它不指定任 ...

  6. shell练习题3

    需求如下: 请按照这样的日期格式(xxxx-xx-xx)每天生成一个文件,例如今天生成的文件为2018-10-19.log, 并把磁盘的使用情况入到这个文件,(不需要写cron,写脚本即可) 参考解答 ...

  7. [Java concurrent][Collections]

    同步容器类 同步容器类包括Vector和Hashtable,二者是早期JDK的一部分.以及一些在JDK1.2中添加的可以由Collections.synchronizedXxx等工厂方法创建的. 这些 ...

  8. Firefox下载附件乱码的解决办法

    通过在http的header里设置fileName下载附件时,中文文件名通过chrome浏览器下载时正常,通过firefox下载时为乱码: 原来的Java代码: response.addHeader( ...

  9. 异常处理——java基础

    Evernote Export 异常处理   异常处理的套路模板: try//创建异常处理{   throw new();//抛出异常 //一旦有异常, 抛出异常后,后面的语句不再执行 语句;{ …… ...

  10. python学习第二次笔记

    python学习第二次记录 1.格式化输出 name = input('请输入姓名') age = input('请输入年龄') height = input('请输入身高') msg = " ...