AtCoder Beginner Contest 172 ABC172 E - NEQ 解説
E - NEQ
問題文
以上以下の整数からなる長さの数列との組であって、以下の条件をすべて満たすものの個数を求めよ。
- なる任意のについて
- なる任意のについてかつ
制約
解説
まず、対称性から、数列を固定して考えます。わかりやすいようにで考えます。 問題分の条件を言い換えると、
- 一個も同じところがない
ということなので、この余事象は
- 少なくとも一個同じところがある
となります。この数え上げは、包除原理を用いるとできます。
包除原理を考えると、少なくとも個同じところがあるという事象の数え上げができればよいことがわかります。 これは、まず同じになるところを箇所から箇所選んで、他はなんでもいいという場合の数なので
(とおく)になります。
全事象はなので、求める答えは
実装
int main() { ll n, m; cin >> n >> m; mint ans = C.Perm(m,n) * C.Perm(m,n); //少なくとも一個重なっている個数 mint sub = 0; /*calc*/ // 何個重なっているかで場合わけ // ある配列 1,2,3,...Nについて考察 //同じになる場所の個数 nCk //残りn-k個の選び方 m-k個の数の集合から選んで並べる m-kPn-k for(int k = 1; k <= n; k++){ mint tmp = C.Comb(n,k) * C.Perm(m-k,n-k);; if(k&1)sub += tmp; else sub -= tmp; } // 対称性よりかけ算すればよい sub *= C.Perm(m, n); ans -= sub; cout << ans << endl; }