ARC102-E Stop. Otherwise...

勉強になったのと,解説があまり丁寧でないのでまとめのため。
問題概要:1からKまでの目が出るサイコロをN個振る。このとき,2\leq i \leq 2Kをみたす各iについて,次の問題に答えよ。

・どの異なる2つの出目の和もiにならないような出目の組の場合の数はいくつか?ただし,サイコロ同士は区別しない。

問題リンクE - Stop. Otherwise...

解法が2つあるので,どちらも紹介する。解法2の方が簡潔である。

解法1(解説解)

iを固定したときの問題を考える。 a+b=iを満たす(a,b)(1\leqq a\leqq b \leqq K)のペアの個数をnとする(具体的なnの値はコード参照)。求める出目の総数は,m個のペアについてはaもしくはbの片方のみの数が出現し,n-m個のペアについてはどちらの数字も現れないような出目の総数をS(m)とすると,\sum_{m=0}^{m=n}S(m)である。
S(m)を求めよう。戦略は以下のようになる。まず,(1)m個のペアを使うと決めたときに,使用できる数の個数を求める。その次に,(2)それらの数を使った出目が何通りあるかを求める。最後に,(3)使用できる数の選び方が何通りあるか求める。これらをすべてかけ合わせた値がS(m)である。
注意する必要があるのは,iが奇数と偶数のときは少しだけ事情が変わってくるということである。iが偶数のとき,上のペアのうち,a=b=\frac{i}{2}となるものが混入するためである。まずは,iが奇数のときを考えよう。

(1) m個のペアの片方の数を必ず使うと決めたので,まずm個の数が手に入る(このとき,a,bどちらを使うかは問題にならない)。他のペアの数は使わないと決めたので,残りは,n個のペアに入らないK-2n個の数たちを使う。よって,使用できる数の個数はK-2n+m個である。

(2) K-2n+m個の数のうちからN個を重複して選ぶ組合せの数なのだが,m個のペアの片方の数を必ず使うと決めたので,N個のうちm個はもう埋まっていると考えよう。すると,残りのN-m個をK-2n+m個の数で埋めてやればよい。重複組合せの記号{}_n \mathrm{H} _r={}_{n+r-1} \mathrm{C} _rを用いれば,{}_{K-2n+m} \mathrm{H} _{N-m}個である。

(3) まず,n個のペアからm個のペアを求める組合せの数は{}_n \mathrm{C} _mである。さらにm個のペアにそれぞれついて,abどちらを選ぶかが2通りあるから,2^mが掛け算される。

以上より,iが奇数のとき,S(m)
S(m)={}_{K-2n+m} \mathrm{H} _{N-m}\times {}_n \mathrm{C} _m \times 2^m
とわかった。これを0\leqq m \leqq nについて足し合わせれば,過不足なく数えることができる。

iが偶数のときは,\frac{i}{2}を使うか使わないかで別々に数えるが,別々になるのは(2)の部分のみである。
・まず,奇数のときと同様に考えるため,ペアの数nn-1に置き換える。
・次に,(1)での使える数の個数はK-2(n-1)-1+mとしておく。-1というのは\frac{i}{2}を差し引いたものである。((1)で求めたのは,重複を許して使うのことのできる数だったという言い方がわかりやすいだろうか。)
・(2)について,\frac{i}{2}を使うとき,埋めるべき枠はN-m-1個,使わないときに埋めるべき枠はN-m個である。
・(3)はnn-1に変わるだけである。
以上より,iが偶数のときは
S(m)=\left({}_{K-2(n-1)+m-1} \mathrm{H} _{N-m-1}+{}_{K-2(n-1)+m-1} \mathrm{H} _{N-m}\right)\times {}_{n-1} \mathrm{C} _m \times 2^m
であり,これを0\leqq m \leqq n-1について足し合わせれば,過不足なく数えることができる。

提出
Submission #3125501 - AtCoder Regular Contest 102

解法2(包除原理)

包除原理がそもそもなにかということについては包除原理 - Wikipediaを参照。
解法1と同様に, a+b=iを満たす(a,b)(1\leqq a\leqq b \leqq K)のペアの個数をnとし,各ペアに1からnまでの番号をつけておく。集合A_k (1\leqq k \leqq n)を「出目の組み合わせのうち,k番目のペアが少なくとも1つあるようなものの集合」と定義する。すると,求める組合せの総数は,集合
\bigcap_{k=1}^{n}\overline{A_k}=\overline{\bigcup_{k=1}^{n}A_k}
の要素の数である(ド・モルガンの法則を用いていることに注意)。よって,包除原理を用いて\bigcup_{k=1}^{n}A_kの要素の個数を求め,全体の出目の組み合わせの数{}_K \mathrm{H} _Nから引けばよい。

m (1\leqq m \leqq n)個のA_kたちの共通部分の要素の大きさを求めよう。m個のペアの数は使うと決めたから,N個のサイコロのうち2m個の出目は決まっている。あとは,残りのN-2m個の枠を,K個の数で埋めると考えてよい。m個のA_kたちの選び方は{}_n \mathrm{C} _mであるから,結局
{}_n \mathrm{C} _m\times {}_K \mathrm{H} _{N-2m}
を,m (1\leqq m \leqq n)の偶奇に対応して足し引きすればよい。

なんと,この解法はiの偶奇に依存していない。包除原理最高である。

提出
Submission #3126896 - AtCoder Regular Contest 102

こういうのが時間内に解けるようになりたいですね。

参考
包除原理 - Wikipedia
E - Stop. Otherwise...
包除原理の解がもう少し丁寧に書いてあります。本記事と表現がちょっと違いますが、基本的な考え方は同じです。
ARC102 参加記録 - ARMERIA

codeforces #502 C ~The Phone Number~

背景が面白い問題だったのでつい投稿。嘘を書いていたら教えてください。
問題要約
長さnのpermutationのうち,最長増加部分列(LIS)の長さと最長減少部分列(LDS)の長さの和が最小になるものを1つ出力せよ。
https://codeforces.com/contest/1017/problem/C

本番はエスパーして解いたので,解説を見たところこう書いてあった。


You can use [Dilworth's theorem]https://en.wikipedia.org/wiki/Dilworth So assume we've already known that  LIS=L,then we can achieve  LDS=\lceil \frac{n}{L} \rceil.



なんでや。



ということで詳しく調べてみた。
まず,いくつか準備。
定義(最小被覆パス)
 G(V,E)を閉路をもたない有向グラフとする。Gの最小被覆パスとは,パスの集合の組P_1,\dots P_kであって,これらがVの分割になっているようなもの(すべての頂点v\in Vに対して,あるP_iがただ1つあって,v\in P_i)のうち,kが最小のものである。

定義(反鎖)
G(V,E)を閉路をもたない有向グラフとする。Gの反鎖(antichain)とは,Vの部分集合Pであって,Pの任意の2要素の間にパスがないもののことである。
本来この語は半順序集合に定義されるもののようだが,閉路をもたない有向グラフは半順序集合とみなせる(と思う)ので,ここではグラフで定義をしても差し支えない。

Dilworthの定理とは以下のようなものらしい。
定理(Dilworth)
閉路をもたない有向グラフG(V,E)における最小被覆パスの大きさ(上の定義でいうところのk)と,Gの最大の反鎖の大きさは等しい。
証明は(https://en.wikipedia.org/wiki/Dilworth%27s_theorem)を参照。こちらは半順序集合の言葉で話を進めているので注意。

LISとLDSに話を戻そう。長さnのpermutationをp_1,p_2,\dots,p_nとする。このとき,頂点集合を\{p_1,p_2,\dots,p_n\}として,グラフを作る。p_i,p_j (1\leq i.j\leq n)について,p_i\lt p_jかつi\lt jのときにp_iからp_jに辺を張る。このグラフをG(V,E)とすると,LISの長さLGの最長のパスの長さであり,LDSの長さKは最大の反鎖の大きさになる。これが肝である。
こんな感じ。
f:id:sigma1113:20180809202306j:plain

LISの長さがLのとき,K=\lceil \frac{n}{L} \rceilが最小であることを示そう。Dilworthの定理より,KG(V,E)の最小被覆パスの大きさに等しい。ここで,LISの長さがLであることから,最小被覆パスを構成するパスたちP_1,P_2,\dots,P_Kのそれぞれの大きさは高々Lである。すると,KL\geq n,つまりK\geq \lceil \frac{n}{L} \rceilが成り立つ。この下界は達成できる。実際,L(K-1)+1,L(K-1)+2,\dots,n,L(K-2)+1,L(K-2)+2,\dots,L(K-1),\dots\dots,L+1,L+2,\dots,2L,1,2,\dots,Lがそうなっている。

本番中に証明までして通した人どれくらいいるんだろう。

参考:
codeforces https://codeforces.com/contest/1017/problem/C
https://codeforces.com/blog/entry/61081

Dilworth's theorem https://en.wikipedia.org/wiki/Dilworth%27s_theorem

Erdős–Szekeres theorem https://en.wikipedia.org/wiki/Erd%C5%91s%E2%80%93Szekeres_theorem

Divisor https://www.slideshare.net/oupc/divisor

順序集合 https://ja.wikipedia.org/wiki/%E9%A0%86%E5%BA%8F%E9%9B%86%E5%90%88