チームA、Bについての場合の数を別々に計算してかけ合わせればよい。以下、killA1+...+killAN=KA, killB1+...+killBM=KBとし、分割数(自然数nのk個以下の分割)をp(n,k)とする。
チームAでキル数が同じメンバーを先頭から順にグループ化し、i番目のグループの人数をaiとする。また、グループの総数をGAとする。
グループa1,...,axに総デス数yを割り振る場合の数をfA(x,y)とすると、
fA(x,y)=f(x−1,y)p(0,ax)+f(x−1,y−1)p(1,ax)+...+f(x−1,0)p(y,ax)(x=0)
fA(0,y)={0(y=0)1(y=0)
である。このとき、チームAにデス数を割り振る場合の数はfA(GA,KB)であり、同様にfBを定めると、答えはfA(GA,KB)fB(GB,KA)である。
計算量について。K=max(KA,KB)とすると、単純計算では高々(N+M)K2≤2×108回のループで済むし、漸化式を観察するとその半分にはなっているので間に合うはず……と考えて提出したのだが、実際の実行時間は250ms程度だったので面食らった。改めて考えてみると、グループの総数には0+1+2+...+(GA−1)≤KAという制約がつくので、GA=O(KA)である。つまり、計算量はO(GAKB2+GBKA2)⊆O(K2.5)になる。実際のループ回数も5×107以下におさまるはずで、それならひとまず納得がいく。
あと、コードテストで
45 45
54 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
54 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
を試したところ、500ms以上はかかりそうだったので、テストケースに最悪ケースはなかったのだろう。
分割数のコーナーケース
p(n,k)の境界の値は次のように定めるとつじつまが合うっぽいのでメモ。
P(0,k)=1
P(n,0)=0(n=0)
P(n,k)=P(n,n)(k>n)
別解
もっと速いDPが可能らしい?
https://kimiyuki.net/writeup/algo/atcoder/dwacon2018-prelims-c/