31
競技数学解説
文献あり

組み合わせ典型(主客転倒, 包除原理, 二項係数etc)

2728
0

はじめに

この記事は Advent Math Calendar2022 25 日目の記事として書かれました.

組み合わせ問題の典型をいくつかピックアップし, 問題を交えながら解説する記事となっています.
その典型を全く知らない方から, ある程度典型を知っている方まで楽しめるような内容を心掛けました.

また, 組み合わせ典型と言いつつ, 実際には代数や整数分野であるような問題/内容も扱っています.

この記事には初出問題がいくつかあります.
記事の地の文内で解説している問題もあるため, 先に問題だけチャレンジしたいという方は
問題だけを抜き出して記事を用意したのでそちらを参照してください.
AMC day25の問題だけ
また, コンテスト形式で問題を解きたい!! という方は問題の中から抽出した 6 問を Google Formで解答できる場 (こちら) を設けたのでそちらもチャレンジしてみてください.

目次

  1. はじめに
  2. 目次
  3. 主客転倒
  4. 包除原理
  5. 対称性
  6. 二項係数
  7. おわりに

主客転倒・寄与ゲー

続いては主客転倒や寄与ゲーと呼ばれるテクニックを紹介します.
これらは若干ニュアンスの違うような気もしますが本質は同じなのでまとめて扱います.
これらの考え方を一言でまとめると, 視点を変える となります.

これだけ言っても何の事やらだと思うのでまずは例題を見てみましょう.

例題

i=11000j=1100011000|ij|
を計算してください.

この問題はシグマの中身だけをちょろっといじってみても和が計算しやすい形にはなりそうにありません.
そこで, 視点を変える主客転倒の考えが活きてきます.

まずこの問題が素直にシグマ内の式変形で解けそうにない原因を考えてみましょう.
(ある方法が上手くいかない原因をはっきりさせるとその後の考察がスムーズにいくというのは全分野共通事項な気がします.)

まず最初の素直な希望として, 内側のシグマだけ計算できないかを考えます.
ちょっと試してると, 分母の異なる分数を足し上げるのが困難そうです. 望遠鏡和のようなテクもダイレクトには効きそうにないです.

ここで考えるのが視点を変えるということです.
それは, "分母の異なる分数を足し上げるのが大変なら分母が等しい数たちをまず足し合わせればよいのでは??" という発想です.

分母が等しい数たちを先に足す方針を考えてみましょう.
以下の表は, i,j の値と |ij| の値の対応表です.

i↓ →j1234561000
1012345999
2101234998
3210123997
4321012996
5432101995
6543210994
10009999989979969959940

これをみると, 斜めに同じ値が並んでいることが分かります.
この1000×1000 の表で, 各値が何回登場するか数えてみましょう.
0 は対角線上に並び, その登場回数は 1000 回です.
1 は2本の斜め線上に並び, その登場回数は 2×999 回です.
2 は2本の斜め線上に並び, その登場回数は 2×998 回です.

k (k=1,2,,999) は2本の斜め線上に並び, その登場回数は 2×(1000k) 回です.

998 は2本の斜め線上に並び, その登場回数は 2×2 回です.
999 は2本の斜め線上に並び, その登場回数は 2×1 回です.

さて, 問題文の式
i=11000j=1100011000|ij|
を今数え上げた |ij| の値毎に足してみましょう.

i=11000j=1100011000|ij|=k=099911000k×(|ij|=kの登場回数)       =10001000k=0+k=19992×(1000k)1000kk=1,2,,999=1+k=19992=1999

あら不思議, 複雑そうな式がするすると計算できてしまいました.

今回の解法を振り返ると,

  • i,j 毎に足すと上手くいかない(表の横や縦方向に足す)
  • |ij| 毎に上手く足すと上手くいく(表の斜め方向に足す)

でした. このように, 問題文で与えられたそのままを扱うと困難なものをまさに別の角度から解きなおすというのが主客転倒の考え方の肝となります.

もう一問例を見てみましょう.

例題

正整数 n に対し, 10000n で割った余りを M(n), n の正の約数の総和を S(n) とします.
n=110000(M(n)+S(n)) を求めてください.

やや恣意的に作られた問題なので折り畳みでヒントを置いておきます.

ヒント

n の各約数 d の寄与が分かるように, S(n) を計算できるような表を書いてみましょう.

n 毎に M(n)+S(n) を計算したり, M(n), S(n) のみの和を取ったりしても中々綺麗にはいきません.
これも表を書いて視点を変えるという事をしましょう.

下の表は各 n が各 m を割り切るなら m を, 割り切らないなら 0 を書いたものです.

m↓ →n12345610000
11111111
20202022
30030030
40004004
50000505
60000060
1000000000010000

この表を縦方向に足し合わせて見ると, n を割り切る m の値が足しあわされている事が分かります. すなわち, 縦に足した和は S(n) です.
特に, 表の数字を全て足し合わせると, n=110000S(n) となります.

視点を変えます.
今度は, 表を横方向に足してみましょう.
m は, 10000 以下の m の倍数の個数分だけ足されます.
10000 以下の m の倍数は 10000m=10000M(m)m 個ですので, 横方向に足し合わせると総和は 10000M(m) となります.

特に, 表の数字を全て足し合わせると, m=110000(10000M(m))=108m=110000M(m) となります.

表を横に足してから縦に足した値と, 縦に足してから横に足した値は等しいので,

n=110000S(n)=108m=110000M(m)

です.
従って, 求める答えは, 108 となります.

この問題も, 2通りの角度から足した結果が等しいことを利用しています.

この章の最後に演習問題として, OMCで実際に出題された問題を紹介します.
足し合わせる方向を変えるという事を意識して考えてみてください.

OMC095-E

 272 項からなる整数列 {ai}i=1,,272 のスコアを以下で定めます.
i=1256|aiai+16|
1,2,,272 を並べ替えてできる整数列は 272! 通り考えられますが, それらのスコアの平均値を求めてください.
 ただし, この平均値は整数値になることが証明できます.
問題へのリンク

ヒント

問題文の素直に解釈すると, 各数列に対して256個の値の総和を求める→全ての数列に対してスコアの総和を求める
という流れになります. 足す順番を変えましょう.
解答
OMC079-D

 正整数 N が増加的であるとは,N10 進法で表記した際に各位の数が上位から狭義単調増加となることをいいます.例えば,1575 は増加的ですが,804421334 は増加的ではありません.
 増加的な正整数は有限個しか存在しません.それらすべてについて総和を求めてください.
問題へのリンク

解答

包除原理

この章では包除原理を説明します.
包除原理が適用されやすいのは, 「条件P または条件Q または条件R または」 を満たすような要素の数え上げです.
まずは簡単な条件が 2 つの場合を考えてみましょう.

例題

120 以下の正整数のうち, 2 の倍数または 3 の倍数であるものはいくつありますか?

まず簡単に分かる事として,

  • 120 以下の正整数のうち, 2 の倍数は 60 個.
  • 120 以下の正整数のうち, 3 の倍数は 40 個.

です.
ここから, 2 の倍数または 3 の倍数となる個数は 60+40=100 個だ!!と答えたいところですが, そう簡単にも行きません.
なぜなら, 2 の倍数と 3 の倍数には重複があるからです.
実際, 2 の倍数と 3 の倍数をそれぞれ列挙してみると,

  • 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
  • 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,

となり, 6,12, が重複していることが分かります.
6 の倍数は 2, 3 両方の倍数であるので, この部分が 2 回カウントされてしまうのです.

以上の事から, 60+40=100 とすると, 6の倍数分だけ余剰にカウントしてしまう ため, 正しい答えが得られていないという事が分かります.

ここでも先の章と同じく, うまくいかない原因が明確に分かっているのでそれを解消する方向で考えてみましょう.

すると, やりたいことはとても単純で, 足しすぎたのなら余剰分を引けば良いのです.
そして今回はまさに余剰分が 120 以下の正整数で 6 の倍数の個数 =20 個というのが直ちに分かります.
つまり, 40+60 から, 余剰分 20 を引いた 40+6020=80 が正しい答えとして得られるのです.

包除原理を説明する上でベン図が良く用いられるので, そちらも紹介します.

包除原理(条件2つ) 包除原理(条件2つ)

これを式で表すと, 以下の通りです.

包除原理(条件2つ)

A1,A2 を集合とする.
この時, |A1A2|=|A1|+|A2||A1A2|

先ほどの例で言うと, A1={120以下の2の倍数である正整数}, A2={120以下の3の倍数である正整数} となります.

それでは次に条件を3つに増やしてみましょう.

例題

120 以下の正整数のうち, 2 の倍数または 3 の倍数または 5 の倍数であるものはいくつありますか?

  • 120 以下の正整数のうち, 2 の倍数は 60 個.
  • 120 以下の正整数のうち, 3 の倍数は 40 個.
  • 120 以下の正整数のうち, 5 の倍数は 24 個.

です.
今回も, 単純に 60+40+24 を計算するとどれだけ重複して足してしまっているかを考えてみましょう.

先ほど同様, 2 の倍数かつ 3 の倍数すなわち, 6 の倍数は重複して足しています. 他にも, 2 の倍数かつ 5 の倍数である 10 の倍数, 3 の倍数かつ 5 の倍数である 15 の倍数は重複しています.

  • 120 以下の正整数のうち, 6 の倍数は 20 個.
  • 120 以下の正整数のうち, 10 の倍数は 12 個.
  • 120 以下の正整数のうち, 15 の倍数は 8 個.

であるので, 60+40+24 から 20+12+8 を引きましょう.
これで重複は取り除けたでしょうか.
表を書いて確認してみましょう.
以下の表は, 2 の倍数か否か, 3 の倍数か否か, 5 の倍数か否かで8通りに分類した時, それが各項の加算減算に寄与しているかを表しています.

2の倍数3の倍数5の倍数2の倍数に+13の倍数に+15の倍数に+16の倍数に-110の倍数に-115の倍数に-1合計
ooo111-1-1-10
oox110-1001
oxo1010-101
oxx1000001
xoo01100-11
xox0100001
xxo0010001
xxx0000000

この表をみると, 2 の倍数かつ3 の倍数かつ 5 の倍数が上手く計上出来ていないようです. (2の倍数でも3の倍数でも5の倍数でもないものも計上されていませんが, それはもともと足されないのが正解のものなので正常な結果です.)

つまり, (60+40+24)(20+12+8)

  • 120 以下の正整数のうち, 30 の倍数は 4 個.

を足せば過不足なく計算ができることが分かります.
よって, 答えは (60+40+24)(20+12+8)+4=88 です.

これもベン図で確認をします.

包除原理(条件3つ) 包除原理(条件3つ)
線で区切られた各部分が丁度1回ずつ足されているのを確かめてみてください.

包除原理(条件3つ)

A1,A2,A3 を集合とする.
この時, |A1A2A3|=|A1|+|A2|+|A3||A1A2||A1A3||A2A3|+|A1A2A3|

条件が2つ,3つ...と来たので次は一般の場合の包除原理を紹介します.

包除原理

A1,A2,,An を有限集合とする.
Sn={1,2,,n} とする.
TSn に対し,
iTAi で, T に含まれるすべての番号 i に対して, Ai の和集合を取った集合を表す.
iTAi は共通部分を取った集合を表す.

この時,

|iSnAi|=TSn,T(1)|T|+1|iTAi|

が成り立つ.

見た目がとても厳ついですが, やっていることは足してから重複を取り除いて, 取り除きすぎた所を足して, また引いて...を繰り返しているだけです.

n=2,3

n=2 の時,
|A1A2|=|A1|+|A2||A1A2|
n=3 の時,
|A1A2A3|=|A1|+|A2|+|A3||A1A2||A1A3||A2A3|+|A1A2A3|
となり, 確かに上の方で具体例から導いた式と一致している.

包除原理

帰納法を用いる.
n=1 の時, 定理の式は両辺とも |A1| で一致している.
n=2 の時, 定理の式は具体例でみた事を一般の集合にしてちゃんと議論し直すだけなので省略.
k=n1 で,
|iSkAi|=TSk,T(1)|T|+1|iTAi|
が成り立つとする.
iSkAi=B とおくと, iSnAi=BAn である.
また, BAn=iSk(AiAn) であるので, n=2,k の場合の包除原理から,

|iSnAi|=|BAn|=|B|+|An||BAn|=TSk,T((1)|T|+1|iTAi|)+|An|TSk,T((1)|T|+1|iT(AiAn)|)=TSk,T((1)|T|+1|iTAi|)+|An|+TSk,T((1)|T{n}|+1|iT{n}Ai|)=TSn,T((1)|T|+1|iTAi|)

よって示された.

かなりごつい式なので補足します.
2 行目から 3 行目へは, n=k の場合の包除原理の式をそれぞれ代入しています.
3 行目から 4 行目へは, 3項目でシグマを走っていた TT{n} に置き換えています.
ここで (A1An)(A2An)(AkAn)=A1A2AkAn であることを用いています.
4 行目から 5 行目へは, シグマを1つに纏めています. 4行目の

  • 1項目のシグマはn を含まない全ての T を動いています.
  • 2項目は T={n} に対応しています.
  • 3項目のシグマはn を含み, {n}とは異なる全ての T を動いています.

これらを足し合わせると全ての 0TSn が網羅されている事が分かると思います.

さてここまで一般の包除原理を紹介しましたが, 競技数学でこの一般の形の包除原理をやるだけという問題はあまり見ないと思います.
というのも,包除原理右辺のシグマは 0TSn 全体を足し合わせますが, Sn の部分集合は 2n 個あり, とても手計算でできない大きさとなるためです.
実際, n=525=32 であるのでこの時点でかなりの筋力を要するでしょう.

そのため, 手計算で答えを求める類の問題で登場する包除原理は何らかの特殊な形をしていることが多いです.

特殊というのは例えば, "実は大半の部分が消える", "二項係数の計算などに帰着できる" , "集合の大きさに一様性がある" 等様々です.
ここでは, "集合の大きさに一様性がある" 場合にどうなるかを見ていきます.
|iTAi||T| のみに依存するケースを紹介します.

|iTAi|=f(|T|) が任意の TSn で矛盾なく成り立つような f が存在すれば, 包除原理は以下の通りになります.

|iSnAi|=t=1n(nt)(1)t+1f(t)

証明については, |T| の値毎に足し合わせる事で示せます. (これもある種の主客転倒のような考えなので是非証明を完了させてみてください.)

おまけ

包除原理はある種の一般化をすることが出来ます.

加法的集合関数

X を集合とする.
f:2XR が加法的集合関数であるとは, AB= である任意の A,BX に対して, f(AB)=f(A)+f(B) が成り立つことをいう.
ここで, 2XX の冪集合(部分集合を全て集めた集合)である.

一般の文脈では加法的集合関数はもう少し広く扱える定義がされます. 今回のはその特別な場合です.

加法的集合関数の包除原理

記号の定義は包除原理の時と同じとする.
f を加法的集合関数とする時,
f(iSnAi)=TSn,T(1)|T|+1f(iTAi)

f(A)=|A| で定めると, f は加法的集合関数です. この f に対して加法的集合関数の包除原理を適用すると通常の包除原理が得られます.
証明は大部分が通常の包除原理と同じであるので以下に証明のヒントだけ記載して, 細部は省略します.

証明のヒント

  • A=(AB)(AB)
  • B=(BA)(AB)
  • AB=(AB)(BA)(AB)

さらに各右辺に表れる集合はそれぞれ互いに素.(共通部分をもたない)

演習問題

120 以下の正整数で, 2 の倍数または 3 の倍数であるような数の総和を求めよ.

解答

X{1,2,,120} に対し, X の要素の総和を f(X) とすると, f は加法的集合関数である.
120 以下の正整数で 2,3,6 の倍数であるものの集合をそれぞれ A,B,C(=AB) とすると, 簡単な計算により, f(A)=3660, f(B)=2460, f(C)=1260 である.
よって, 求める値は f(AB)=f(A)+f(B)f(C)=4860

対象をまとめる, 対象の対称性に注目する

次は知識の典型ではなく, 考え方の典型です.
数え上げでは個々を追うと計算が大変でも, 全体でみると計算がしやすい方法があるというのは主客転倒章でも触れたことです. この章ではそこに再び焦点をあてます.

まずは以下の問題を考えてみましょう.

例題

 99999 以下の非負整数のうち, 10 進法表記で各位の数の和が 15 の倍数である数の総和を求めてください.

99999 以下の非負整数の各位の数の和は 0 以上 45 以下です.
よって, 各位の数の和が 0,15,30,45 であるような数の総和が求まれば良いです.
0,45 に関してはそれぞれ1通りなので簡単です.
各位の数の和が 15,30 となる数の和はどうでしょうか.

素直に計算しようとすると大変そうですね. そこで, 対象を纏めるという事をします.
具体的には, 9+9+9+9+9=45=15+30 を利用します.
すなわち, 非負整数 n の十進法表記 n=a104+b103+c102+d10+ea+b+c+d+e=15 を満たすとき, 99999n=(9a)104+(9b)103+(9c)102+(9d)10+(9e) であり, (9a)+(9b)+(9c)+(9d)+(9e)=30 となります.
逆に各位の数の和が 30 である非負整数 n については, 99999n は各位の数の和が 15 となります.

よって, 各位の数の和がそれぞれ 15,30 である数の集合は, n+m=99999 となるように1対1のペアが作れます.
従って, 各位の数の和が 15,30 となる全ての数の総和は, 99999(各位の数の和が15となる非負整数の数) となります.
各位の数の和が 15 となる非負整数の個数は, 15以下の5つの非負整数で和が 15 になる組み合わせ数から 15以下の5つの非負整数で和が 15 になり, 少なくとも一つが 10 以上となる組み合わせ数を引くことで, (194)5(94)=3246 通りです.
よって各位の数の和が0,45 の場合と合わせて, 求める答えは 0+99999+999993246=324696753 となります.

例題

 9699690(=20以下の素数の総乗=235711131719) 未満の非負整数のうち, 20 以下の素因数をもつ数の総和を求めてください.

この問題は包除原理の章の最後に紹介した問題の制約が大きいverです.
つまり, 包除原理を用いることで解くことができますが, それは恐らくかなりの計算が必要となってしまいます.

そこで, 対称性を利用した解き方を紹介します.
20 以下の素数で割り切れる非負整数を良い数と呼ぶことにします.
この時, n が良い数9699690n が良い数 という, 先ほどの問題と似た性質が現れます.
つまり, 9699690 未満の良い数のうち 0 でない数の平均値は 96996902 となります.
総和=平均値*要素数ですので, 後は 9699690 未満の良い数の個数が求まればよいです.

9699690 未満の良い数でない数を数えると, 9699690122345671011121316171819=2123451=1658880 個あることが分かります(なぜこの計算で求まるかは演習とします).

よって9699690 未満の良い数は 96996901658880=8040810 個あるので, 求める答えは
(80408101)96996902=38996677324605
となります.

ここまでは数え上げる対象がバラバラで, それを纏める事で数えやすくするという事を考えてきました.
この章の最後にその逆である数えるべき対象がまとまっているので, バラバラの状態に一旦落とし込むタイプの問題を紹介します.
かなりお気に入りの一問です.

OMC0110-E

 9 つの箱 1,2,,9 があり,これらに 9 種類の玉 1,2,,9 を次をみたすように入れることを考えます.

  • i=1,2,,9 に対し箱 i には 玉 i と玉 i+1 が合わせて 10 個入っており,それ以外の種類の玉は1つも入っていない.

ただし玉 10 は玉 1 を表すものとし,また 1 種類の玉しか入っていない箱があっても構いません. 箱に入っている玉 i の総数を ai とするとき,組 (a1,a2,,a9) としてあり得るものは何通りありますか?
問題へのリンク

ヒント

いくつかの "各箱の各玉の数"の組から同じ "各玉の数の和"の組が現れます.
よって, 前者を考えるのは遠回りのようですが, 扱い易いのは圧倒的に前者です.
まずは前者について考えて, どのような条件の前者の組が, 同一の後者の組となるかを考えてみましょう.
解答

二項係数

数え上げの問題では二項係数が度々登場します.
この章では二項係数に因む等式をその導出の道具ごとにいくつか紹介します.
なお実際には素朴な定義等から示した方が早く, 楽な等式もありますが, ここでは分類上難しい方法で示している場合があります. 余力のある方は楽な方法も考えてみてください.

記法

この章では二項係数を (nk)(=nCk) で表し, n<k に対して (nk)=0 とする.
また, 特筆されていない場合全て n>0 とする. (n=0で成り立たない等式もいくつかあります.)

多項式と絡めるタイプ

多項式, とりわけ二項定理から二項係数の面白い性質が色々と現れます.

二項定理

(x+y)n=k=0nxkynk(nk)

例えば, x=y=1 や, x=1, y=1 を代入してみると,

2n=k=0n(nk),0=k=0n(1)k(nk)

を得ます.
さらに, 定理1は多項式であるので, 微積分ができます.
定理1の両辺をxで微分してみましょう.

n(x+y)n1=k=1nkxk1ynk(nk)

ここに再び x=y=1 や, x=1, y=1 を代入してみると,

n2n1=k=0nk(nk),0=k=0n(1)k1k(nk)

となります.

今度は等式1の両辺をx について 0 から x まで積分してみると,

(x+y)n+1yn+1n+1=k=0n1k+1xk+1ynk(nk)

ここに三度 x=y=1 や, x=1, y=1 を代入してみると,

2n+11n+1=k=0n1k+1(nk),1n+1=k=0n(1)k+1k+1(nk)

となります.
各式をさらに積分したり, x をかけてから微分したり, (x,y) に他の値を代入した等々, 様々なバリエーションで他の等式を作り出すことができます.
皆さんもガチャガチャ式をいじってみて好きな等式が出来たら是非tweetでもしてください.

組み合わせの本筋から外れますが, 二項係数で問題を作ろうとしてちょっと面白い等式が作れたので観賞用問題として紹介します. (初手発想ゲーです.)

観賞用?

xtanx が定義される実数とします.
cosnxcosnx=k=0n2(1)ktan2kx(n2k)
を示してください.

解答の概略

(cosx+isinx)n に二項定理を用いる.
演習問題

k=015(1)k(k+1)(k+3)(nk)=ab
を満たす互いに素な正整数 a,b について a+b を求めてください.

解答

(x+1)n0 から x まで積分, x を掛ける, 0 から x まで積分をすると,
1n+1((x+1)n+31n+3(x+1)n+21n+2x22)=k=0kxk+3(k+1)(k+3)(nk)
となる. (x(x+1)m=(x+1)m+1(x+1)m を使うと幾分か計算が楽である.)
特に, x=1 を代入して,
k=015(1)k(k+1)(k+3)(nk)=(n+2)(n+3)22(n+1)(n+2)(n+3)=n+42(n+2)(n+3)
である.
n=15 で,
19612=ab
である. よって求める答えは 19+612=631

問題を複数通りで解釈するタイプ

二項係数がらみの問題を2通りの解釈で解くことによって二項係数間の等式を示すことができることがあります.
ここでは汎用性の高そうな2つの等式を紹介します.

ヴァンデルモンドの畳み込み

正整数 m,p の値と, 長さ p の正整数列 n1,n2,,np は与えられたものとする.
i=1pki=mi=1p(niki)=(i=1pnim)

例えば p=2 の時 k1+k2=m(n1k1)(n2k2)=(n1+n2m) となり, 特に n1=n2=m=N の時,
k=0N(Nk)2=(2NN)
という有名等式が得られます.
ヴァンデルモンドの畳み込みをある問題の答えを2通りに表すことによって示します.

ヴァンデルモンドの畳み込みを示すための問題

AMC高校には p 個のクラスがあり, i 個目のクラスには ni 人の生徒が在籍しています.
n1+n2++np 人の中から計 m 人を選出する方法は何通りありますか.

この問題を解く 1 つ目の方法はクラスを完全に無視することです.
クラス分けを無視すると, この問題は単に i=1pni 人の中から m 人を選ぶ問題なので, (i=1pnim) 通りが答えであると分かります.

次にクラスごとに考えてみましょう.
i 番目のクラスから ki 人を選ぶとして,この値を一旦固定すると, 各クラスでの人の選び方は (niki) 通りです. この選び方はクラスごとに独立であるため, 各クラスから (k1,k2,,kp) 人選ぶ方法は i=1p(niki) 通りです.
これを i=1pki=m を満たすkiの組について足し合わせればよいので, この問題の答えは i=1pki=mi=1p(niki) であると分かります.

ここで2通りの表示で得た値は同じ問題の答え(すなわち同じ値)であるので, ヴァンデルモンドの畳み込みが示されました.

続いての等式を紹介します.

ホッケースティック恒等式

i=kn(ik)=(n+1k+1),(nk)

この恒等式を経路問題を 2 通りの表示で答えることによって示してみましょう.

ホッケースティック恒等式を示すための問題

xy 平面上の点 (0,0) に点 P があります. この点は (x,y) にいる時に (x+1,y) または (x,y+1) に移動することを繰り返します.
(0,0) から (nk,k+1) (nk) へ移動する方法は何通りありますか.

まず1 つ目の解法としては素直に経路問題として解く方法で, (nk+k+1k+1)=(n+1k+1) がこの問題の答えであると分かります.

次に, ひねくれた解き方をします.
(nk,k+1) へ移動するとき, (i,k) から (i,k+1) へ移動するような i が各移動経路に対して一意的に存在します.
よって, この i 毎に和を取ることができます.
(0,0) から (i,k) への移動は (i+kk) 通り, (i,k+1) から (nk,k+1) への移動は 1 通りであるので, 求める総経路数は
i=0nk((i+kk)×1)=i=kn(ik)
となります.

ここで2通りの表示で得た答えは同じ値であるので, ホッケースティック恒等式が示されました.

演習問題

N,M>m に対し,
i=0N(i+mm)(N+Mmi1Mm1)=(N+MN)
を示してください.

解答の概略

(0,0) から (N,M) への移動経路を, (i,m) から (i,m+1) へ移動するような i の値毎に足し合わせる.

二項係数mod p

この章の後半では組み合わせ論チックでは無いですが短答式のOMCで役に立つかもしれない二項係数の定理を紹介します.

Kummerの定理

p を素数, n>k を正整数とする.
この時, (nk)p で割り切れる回数は, (nk)+kp 進法表記で(筆算のように)計算する時の繰り上がりの回数と等しい.

(105)=25232 回割り切れる.
5+53 進法表記で計算すると,
   1  2+   1  21  0  1
となり, 1 の位から 3 の位へと 3 の位から 9 の位への 2 回繰り上がりが起こる.

Kummerの定理

n,k,nkp 進法による表示をそれぞれ,
n=i=0maipi, k=i=0mbipi, nk=i=0mcipi
とする.
この時, (nk)+k=n の計算時に pj から pj+1 の位へ繰り上がりが

  • 起こるとき, i=j+1maipii=j+1mbipii=j+1mcipi=pj+1
  • 起こらないとき, i=j+1maipii=j+1mbipii=j+1mcipi=0

に注意する.
Legendres の定理より, (nk)p で割り切れる回数 v は,
v=j=1m(npjkpjnkpj)
である.
j 毎に, npjkpjnkpj の値を考える.

npjkpjnkpj=i=jmaipiji=jmbipiji=jmcipij={1(pj1の位からpjの位へ繰り上がる)0(pj1の位からpjの位へ繰り上がらない)
である.
よって, これを j=1,2,m と足し合わせれば, 定理の主張を得る.
(下から数行目が表示上切れていますが, 上段は繰り上がる, 下段は繰り上がらないです.)

Lucasの定理

p を素数, n>k を正整数とする.
n,kp 進法による表示をそれぞれ,
n=i=0maipi, k=i=0mbipi,
とする.
この時,
(nk)i=0m(aibi)modp
が成り立つ.

11=1+25,6=1+15 であり,
(116)=4622=(21)(11)mod5 である.

Lucasの定理

X=xp+q, Y=yp+r に対して, (XY)(xy)(qr)modp が示されればこの合同式を n,k について下位の位から順に適用すれば定理の主張が得られる.

  1. q<r の時
    (xp+qyp+r)=xp(xp1yp+rq1)1yp+rqxp+1yp+rq+1xp+qyp+r
    p の倍数である.
    q<r より (XY)(qr)=0 であるので, 合同式は成立する.
  2. qr の時.
    (xp+qyp+r)=(xp+qryp)xp+qyp+rxp+q1yp+r1xp+qr+1yp+1(xp+qryp)qrq1r1qr+11=(xp+qryp)(qr)modp
    であるので, r=0 の場合に合同式 (xp+qyp)(xy) が示されればよいが, これは,
    (xp+qyp)(xp)((x1)p)((xy+1)p)yp(y1)pp((p1)!)y((p1)!)y(xy)modp
    から従う.
演習問題

0kn<310007 を満たす整数 (n,k) の組全てについて, (nk)3 で割った余りを足し合わせた値を M とします.
M10007 で割った余りを求めてください. 但し, 10007 は素数です.

解答

p=10007 とする.
Lucasの定理より, 2つの, 3未満の非負整数からなる長さp の数列 (n0,n1,,np1), (k0,k1,,kp1) の組全てに対して i=0p1(niki) を足し合わせた値を求めればよい.
3 未満の非負整数の組 n0,k0 の組で (n0k0)=1,2 となる組の数はそれぞれ 5,1 通りである.
よって, ai, bi をそれぞれ (n0,n1,,ni), (k0,k1,,ki) の組で, j=0i(njkj) の値が 1,2 となるものの数と定めると,
a0=5, b0=1, ai+1=5ai+bi, bi+1=ai+5i+1 という漸化式がたつ.
これを解くと, 2ai=6i+1+4i+1, 2bi=6i+14i+1 を得る.
よって, M=36p1+24p1+2(36p124p1)=96p124p1
である.
Felmatの小定理より, 求める答えは 91217

なお, ai, bi はFPSを用いると, は (5+x)i+1 のそれぞれ偶数次, 奇数次の係数の和であるので, x=1,1 を代入して和や積を取ることで漸化式を陽に解かずに解を求められる.
多項係数

ここで紹介した公式や定理の中には多項係数 (i=1knk)!i=1knk!
に関する公式や定理に一般化が出来るものがあります.
是非考えてみてください.

おわりに

ここまでお読みいただきありがとうございます.
まだまだ書きたいことはたくさんありましたが, 書き切れなかったのでそれはまたの機会に回そうと思います. (FPSについても書きたかった......)
皆さんも年末年始に是非組み合わせ問題をしましょう!!

参考文献

投稿日:20221225
OptHub AI Competition

この記事を高評価した人

高評価したユーザはいません

この記事に送られたバッジ

バッジはありません。
バッチを贈って投稿者を応援しよう

バッチを贈ると投稿者に現金やAmazonのギフトカードが還元されます。

投稿者

karihito
karihito
33
2904

コメント

他の人のコメント

コメントはありません。
読み込み中...
読み込み中
  1. はじめに
  2. 目次
  3. 主客転倒・寄与ゲー
  4. 包除原理
  5. 対象をまとめる, 対象の対称性に注目する
  6. 二項係数
  7. おわりに
  8. 参考文献