皆さんこんにちは!今回は主客転倒というテクニックについて解説していきます。数学オリンピックや競技プログラミングなどに幅広く使えるテクニックですのでぜひ見ていってください。
本記事に修正、加筆を加えた 最新版 もぜひご覧ください。
突然ですが皆さんは下記の表の総和を数える時,列ごとに数えますか?それとも行ごとに数えますか?
列 \ 行 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
1 | 1 | 0 | 0 | 4 | 5 |
2 | 1 | 2 | 0 | 4 | 0 |
3 | 0 | 2 | 3 | 4 | 5 |
4 | 1 | 0 | 0 | 4 | 0 |
5 | 0 | 2 | 3 | 0 | 5 |
6 | 1 | 2 | 0 | 0 | 5 |
7 | 0 | 0 | 3 | 0 | 0 |
おそらく各行を足してからそれらの合計を出すよりも,各列を足してからそれらの合計を出す方がわかりやすいですよね.今回の表は行ごとに見るとなんの法則性もありませんが,列ごとに見ると「同じ数字が出てくる」という法則性があると言うところにあります.実は,今回扱う主客転倒も自分が数えやすように工夫しようと言う考え方なのです.
主客転倒を一言で言うと,「視点を変えて楽に数え上げをしよう」ということです.もう少し具体的に言うと、「各事象がどれだけ合計に寄与、貢献しているかを考える」と言うことです.とは言ってもイメージが湧かないと思うのでとりあえず以下の例を見ていきましょう.
$(1,2, \cdots ,n)$の並べ替え$(a_1,a_2, \cdots , a_n)$に対して"スコア"を「$a_i=i$なる$i$の個数($1 \le i \le n$)」で定める.この時,$(a_1,a_2, \cdots , a_n)$として有り得るもの全てについてそのスコアの総和を求めよ.
一般式を立てて計算!といきたいところですが,残念ながら各並べ替えのスコアを一般式で表すのは難しそうです.そこで少し視点を変えて見てみましょう.
まずは手始めに「$a_1=1$となるケースが何通り存在するか?」を考えてみましょう.
$a_1=1$となるケースを数えるには,単純に$a_1=1$を固定して残りの並べ替えを考えれば良いですね.$n-1$個の数字を並べ替える方法なので$(n-1)!$通り存在しますね.
つまり,$a_1=1$が貢献する回数は$(n-1)!$となります.同様に他の文字についても考えると,$\underbrace{(n-1)!+(n-1)!+\cdots+(n-1)!}_{n個}=n!$となるわけです.
よって求めるスコアの総和は$n!$となるわけです.
このように「貢献」を考えることを主客転倒と言います.とても便利な考え方ですね!次の例題にて,応用的な問題も見てみましょう.
$(1,2, \cdots ,n)$の並べ替え$(a_1,a_2, \cdots , a_n)$に対して"スコア"を「$a_i=i$なる$i$の個数($1 \le i \le n$)」で定める.この時,$(a_1,a_2, \cdots , a_n)$として有り得るもの全てについてそのスコアの二乗の総和を求めよ.
困りましたね,スコアの二乗の総和です.以下に例を載せておきます.
このような場合は以下のように言葉で書き換えてみると良いでしょう.
$ $($a_i=i$なる$i$の個数)$^2$
=($a_i=i$なる$i$の個数)$\times$ ($a_i=i$なる$i$の個数)
=($a_i=i$なる$i$の個数)$\times$ ($a_j=j$なる$j$の個数)
この変形はとても当たり前のことですが,実はとってもありがたいのです.その理由は以下のように簡単に計算できることにあります.(二つのケースに場合分けして計算)
「$a_i=a_j=i=j$であるケース」について考えます.これは例1そのまんまですね.$n!$通りです.
「$a_i=i$かつ$a_j=j$であり$i \neq j$なケース」について考えます.これは$a_i$と$a_j$の二つを固定して主客転倒をしてあげれば良いです.$_nC_2\cdot 2\cdot (n-2)!=n!$通りです.
よって,上記の二通りを足し合わせれば$2\cdot n!$通りであるとわかります.
二乗を言葉に表現してあげることで,論理積へと分解することができました.とても有用なテクニックだと思います.それでは,基本的なことはわかったと思うので演習問題で慣れていきましょう!
$(1,2, \cdots ,n)$の並び替え$(a_1,a_2, \cdots ,a_n)$に対して"スコア"を$a_i=i$なる$i$($1 \le i \le n$)の総和で定める.このとき,$n!$通り全ての並べ替えの"スコア"の総和を求めよ.
$ $
$n \ge 2$とする.$(1,2, \cdots ,n)$の並び替え$(a_1,a_2, \cdots ,a_n)$に対して"スコア"を$a_i=i, a_{i+1}=i+1$なる$i$($1 \le i \le n$)の個数で定める.(ただし,$n+1=1$とみなす.)このとき,$n!$通り全ての並べ替えの"スコア"の総和を求めよ.
$ $
$f(x)$を$x$の$200$以上の約数の個数とする.このとき以下の値を計算せよ.
$n \times n $のマス目を白と黒の2色で塗り分ける.黒いマスと白いマスの両方に隣接している辺を"境界辺"と呼ぶ.このとき,$2^{n^{2}}$通り全ての塗り分けについて"境界辺"の個数の総和を求めよ.
$N$以下の順序付き正整数の組$(a,b,c)$全てについて,$max(a,b,c)$の総和を計算したものを$f(N)$とおきます.このとき,$4f(10^{2021})$の各桁の総和を求めてください.
$272$項からなる数列$\{a_i\}_{i=1,2,\cdots,272}$の"スコア"を以下で定めます.
$N$を$99,100,101$で割った余りのうち最小のものを$f(N)$について,以下の総和を求めてください.
$1,2,\cdots,1000$の置換$a_1,a_2,\cdots,a_{1000}$について,$a_i< a_{i+1}$を満たす正整数$i$の個数を$N$とします.$1000!$通りある全ての置換に対して$N^2$の(相加)平均$M$を求めてください.
$1,2,\cdots,2017$の並べ替え$\sigma = (\sigma(1),\sigma(2),\cdots,\sigma(2017))$について,$\sigma(i)=i$となる$1 \le i \le 2017$の個数を$F(\sigma)$とする.全ての並べ替え$\sigma$について$F(\sigma)^4$を足し合わせた値を求めよ.
さらに追加で演習したい方に向けて僕が良問だなと感じた問題のリストを下に置いておきます。
・JJMO2018-7
・JMO2021-11
・JMO2017-6
・OMC136-F
※出典がない場合は基本的に自作問題です.
今回は教科書のような構造で解説してみました.「冗長すぎる」や「わかりやすかった」などの感想があればぜひ教えてください.個人的に主客転倒はかなり感動させられた記憶があるのでこの感動をより多くの人に味わってもらいたいなと思いこの記事を作成しました.
また,今回の記事作成にあたっていくつかアドバイスをいただきました.協力してくださった方は本当にありがとうございます.