[AtCoder AGC002 F][DP]Leftmost Ball

标签: DP
1145人阅读 评论(0) 收藏 举报
分类:

观察发现每个白球后面至少有一种颜色出现k-1次(就是只出现在这个白球后面),知道这个性质后可以从后往前DP

把每次放一种颜色的球分成两次,一次放k-1个这种颜色的球,一次放1个白球,这样需要放2*n次

fi,j,k表示放了i次,放了j种颜色,当前可以放k个白球,这样转移要n^3
可以省去i这一维。
放一个白球 fj,kfj,k1
放一种颜色 fj,kC(ikj1,k2)fj+1,k+1(因为放一种颜色要放k-1个球,其中一个球确定放在当前这一位,所以只要乘上k-2个球的放置方案就可以了)

组合数预处理一下,就可以n^2了

#include <cstdio>
#include <iostream>
#include <algorithm>
#define N 2010
#define M 4000000
#define P 1000000007

using namespace std;

typedef long long ll;

int n,k;
ll f[N][N],fac[N*N],inv[N*N];

inline int C(int x,int y){
  if(x<y) return 0;
  return fac[x]*inv[y]%P*inv[x-y]%P;
}

int main(){
  freopen("1.in","r",stdin);
  freopen("1.out","w",stdout);
  scanf("%d%d",&n,&k);
  if(k==1) return puts("1"),0;
  fac[0]=inv[0]=inv[1]=1;
  for(int i=1;i<=M;i++) fac[i]=fac[i-1]*i%P;
  for(int i=2;i<=M;i++) inv[i]=(P-P/i)*inv[P%i]%P;
  for(int i=1;i<=M;i++) inv[i]=inv[i]*inv[i-1]%P;
  f[0][0]=1;
  for(int i=1;i<=n;i++)
    for(int j=i;~j;j--){
      f[i][j]=f[i][j+1]%P;
      if(j) (f[i][j]+=f[i-1][j-1]*C(i*k-j-1,k-2))%=P;
    }
  printf("%lld\n",f[n][0]*fac[n]%P);
  return 0;
}
查看评论

【AGC002F】Leftmost Ball 组合

原题走这里又是一道思维难度很大的题,思路很难想到首先,不妨假设颜色1~n依次出现,只要最后把答案乘上n!就可以了并且,如果排列是合法的,那么第i个无色球必然在第i个颜色之前出现那么,问题就转化为了对于...
  • CRTorlonia
  • CRTorlonia
  • 2018-02-22 16:50:22
  • 66

【AGC002F】Leftmost Ball DP 数学

题目大意  有nn种颜色的球,每种mm个。现在zjt把这nmnm个球排成一排,然后把每种颜色的最左边的球染成第n+1n+1种颜色。求最终的颜色序列有多少种,对10000000071000000007取...
  • ez_yww
  • ez_yww
  • 2017-10-19 17:54:02
  • 115

[agc002f]Leftmost Ball

前言小清新计数题。题意n种颜色每种颜色有k个球(这n种颜色不含白色),排成一行,把每种颜色第一个球涂成白色。 问颜色序列方案数。DP要求任意后缀0的个数不比颜色种类数多。 不妨设dp表示f[i,j...
  • WerKeyTom_FTD
  • WerKeyTom_FTD
  • 2017-10-26 09:45:44
  • 203

AtCoder Grand Contest 002 F - Leftmost Ball 动态规划

题意 有n种颜色,每种颜色有恰好k个小球。现在把这n*k个小球排成一排,然后把每种颜色最左边的小球染成颜色0。问总共有多少种不同的颜色序列。 n,k&amp;lt;=2000 分析 我们可...
  • qq_33229466
  • qq_33229466
  • 2018-02-11 15:15:19
  • 99

插头DP小结

插头DP一般都是棋盘模型,找路径或者环路最值或者方案数。 插头:说白了就是两个联通的格子,一个走向另一个,那么这里就有一个插头。 轮廓线:DP逐格DP,那么轮廓线可以分开DP过的格子和未DP的格子...
  • Quack_quack
  • Quack_quack
  • 2016-02-18 22:34:46
  • 3107

(DP)最大子段和问题分析和总结(…

转载自http://www.cnblogs.com/shihao/archive/2012/01/18/2325562.html 最大子段和问题分析和总结 最大子段和问题(Maximum Inte...
  • lanjiangzhou
  • lanjiangzhou
  • 2013-05-30 10:50:29
  • 605

[AtCoder AGC005 D][容斥][DP] ~K Perm Counting

既然APIO讲到了,就补一发计数题题意是求有多少个n的排列,满足对于任意ii,|a[i]−i|≠k|a[i]-i|\neq k,kk是给定整数陈老师说的简单DP不会啊…只好求助Manchery另fif...
  • Coldef
  • Coldef
  • 2017-05-14 08:37:39
  • 613

AtCoder Grant Contest 010 C - Cleaning DP, DFS,思维题 2017/2/6

有一棵N个节点的树,节点标号1-N,第i个边连着两个节点ai, bi。 每个节点有Ai个石头。每次你可以选择一对叶子节点(叶子节点是度数为1的点),然后将连接着两个节点的路径上的所有节点的石头数减一...
  • just_sort
  • just_sort
  • 2017-02-11 23:19:19
  • 415

[DP]Atcoder ARC 087 D - FT Robot

x和y分开处理,将TFF..FFF(k个F)看做一个整体,视为某一坐标加k或减k,DP一下就没了。 代码丑。#include #include using namespace std; const ...
  • Axcosin
  • Axcosin
  • 2017-12-17 21:15:30
  • 215

dp--ATCODER013A - Sorted Arrays

题目类型:dp 题意:连续串的个数...(连续串:单调串--升序||降序)
  • w1y2s312138
  • w1y2s312138
  • 2017-04-15 22:15:49
  • 142
    个人资料
    持之以恒
    等级:
    访问量: 10万+
    积分: 5256
    排名: 6493
    文章分类
    最新评论