SlideShare une entreprise Scribd logo
1  sur  22
Télécharger pour lire hors ligne
AtCoder Regular Contest 032
解説
AtCoder株式会社 代表取締役
高橋 直大
2015/1/3 1
競技プログラミングを始める前に
• 競技プログラミングをやったことがない人へ
– まずはこっちのスライドを見よう!
– http://www.slideshare.net/chokudai/abc004
2015/1/3 2
©AtCoder Inc. All rights reserved. 3
A問題 ホリドッグ
1. 問題概要
2. アルゴリズム
2015/1/3 3
A問題 問題概要
• Nが与えられる
• 1+2+…+Nの素数判定せよ
• 制約
– 1 ≦ N ≦ 999
2015/1/3 4
A問題 アルゴリズム
• 解法1
– S=1+2+…+Nをforループで計算する
• N=1000のとき最大でS=1+2+…+1000 = 500500
– それに対して素数判定をforループで行う
• 2~S-1の範囲でSを割り切る数がないか確かめる
• 解法2
– S=1+2+…+N=
𝑁 𝑁+1
2
(総和の公式)
• 式から明らかにNが小さいとき以外は素数にならなさそう
– N=1のときは1なので素数ではない
– N=2のときは素数
– N>2のとき常に合成数
• N=2のときだけ素数,それ以外のとき非素数なので,
その事実にしたがって出力すればよい
2015/1/3 5
©AtCoder Inc. All rights reserved. 6
B問題 道路工事
1. 問題概要
2. アルゴリズム
2015/1/3 6
B問題 問題概要
• N 頂点 M 辺の無向グラフが与えられる
• グラフに最小でいくつ辺を追加すれば、全体がつな
がるか調べる
• 制約
– 0 ≦ N,M ≦ 100000
2015/1/3 7
B問題 アルゴリズム
• 考察
– グラフのつながっている部分がK個あるとき、最小でK-1本
の辺があれば全体をつなげられる。
– 1本つながっていない部分の間に辺を追加すると、Kは1減
るから。
2015/1/3 8
黒がもともとある道路
このとき、K=3
2本の赤の辺を追加すれば全
体がつながる
B問題 アルゴリズム
• なので、グラフのつながっている部分(連結成分と呼
ばれる)の数を数えればよい。
• 解法1
– Union-Findですべての辺をつないだ後、Union-Find木での
root の数を数える(具体的には、頂点 v のrootが v のもの
を数えると楽。連結成分ごとに root は共通で、自身が
root となるものがちょうど 1 つあるから)
• 解法2
– 今まででまだ訪れていない頂点を見つけたら、 DFSを使い
そこから行ける頂点をすべて訪れて、連結成分の数を1つ
加える etc…
• どちらも(ほぼ)線形時間
2015/1/3 9
©AtCoder Inc. All rights reserved. 10
C問題 仕事計画
1. 問題概要
2. アルゴリズム
2015/1/3 10
C問題 問題概要
• 時刻の区間がN個与えられます。区間は順に1から
Nまで番号付けられています。
• i 番目の区間は a_i から b_i まで。
• 互いに被らない条件の下で、なるべく多くの区間を
選びたい(端点は被ってもOK)
• 複数あるときは、区間の早い順に並べた時の辞書
順最小となるものを1つ出力。
• 制約
– 0 ≦ a_i, b_i ≦ 1000000
– 1 ≦ N ≦ 100000
2015/1/3 11
C問題 アルゴリズム
• これ蟻本でやったやつだ!(区間スケジューリング問
題, p43)
– 蟻本を読もう!
– 具体的には、終了時間が早い順にソートし、貪欲に区間
を選んで行けば、区間数最大の解が1つ得られる
• しかし、辞書順最小での構成を1つ出力しなければ
ならない
• なるべく多く取れる取り方のうち、辞書順最小のもの
を求めるときは、最初に取れるものを最小化し続け
る必要がある
2015/1/3 12
C問題 アルゴリズム
• 時刻 i それぞれに対し、(i 以降で最大でいくつ取れ
るか?,最大の取り方のうち、次に取れる最小の仕事
の番号はいくつか?) のペアが更新すればできそう
– i から始めるとき、次に取る区間は辞書順最小の条件か
ら、(最大の取り方のうち、次に取れる最小の仕事の番号)
となるから
• このペアを dp[i] とおく
2015/1/3 13
C問題 アルゴリズム
• dp[i] を求めるとき、
– 時刻 i から始まる区間を使うとき、時刻 i から始まり、b で終わ
る番号idの区間を使う場合、 (b以降で取れる区間の最大数
+1,id) が候補
– 時刻 i から始まる区間を使わないとき、(時刻 i+1 以降で取れる
区間の最大数, そのうちの最小の仕事の番号) が候補
– 以上のペアから、取れる区間の最大数で比較し、多いものを選
ぶ。それが同じなら、次に取る仕事の番号が小さいものを選ぶ。
• 番号が同じ区間はないので、このペアが同じになることは無い
• 以上のことから、dp[i] の更新に必要なのは i+1 以降の
dpの情報
• よって、dp[i] を後ろから更新していけばよい
2015/1/3 14
C問題 アルゴリズム
• dp[0] が求まったら、0 以降で取れる区間の最大数
が1つ目の答え。
• 復元するときは、今の時刻以降で最大の取り方のう
ち最小の番号の区間をとり続けていく
– dp のペアの2番目の情報にこれがそのまま入っている
– 最初に “今の時刻”=0 とし、次に取る区間を答えに追加
し、”今の時刻”を最後に取った区間の終端に更新
– これを、取れる区間が無くなるまで繰り返す
• 合計でもO(N)!
2015/1/3 15
©AtCoder Inc. All rights reserved. 16
D問題 アットコーダーモンスターズ
1. 問題概要
2. 考察
3. アルゴリズム
2015/1/3 16
D問題 問題概要
• N匹のモンスターがいる
• 各モンスターには攻撃力と防御力というパラメータがある
• ちょうどK匹のモンスターを買いたい
• あるモンスターの対について,攻撃力の差と防御力の差の
最大値を不安定度と定義
• K匹からなるチームに含まれるペアの不安定度の最大値
(=チームの不安定度)を最小化し,それを達成する組み合わ
せ数 mod 100000007 を出力しろ.
• 制約
– 1 ≦ K ≦ N ≦ 100,000
– 0 ≦ 各モンスターの防御力,攻撃力 ≦ 3000
2015/1/3 17
D問題 考察
• まず,チームの不安定度の最小値を求めたい.
• モンスターの(攻撃力,防御力)を二次元平面に点とし
てプロットしてみる
• あるチームの不安定度をxと決めたとき,
– 一辺xの正方形領域に含まれる点の数がK以上であるようなところ
が存在すれば,不安定度x以下にできることが分かる.
• これで二分探索したらよさそう.
• 任意の正方形領域に含まれる点の数を高速に計算
するため,予め二次元累積和を計算しておく.
D問題 考察
• 次にチームの不安定度の最小値mを達成する組み
合わせ数を求めたい.
• 単純に全ての領域に対してKコを選ぶ組み合わせの
数を計算するのは,重複が発生しダメ.
• ある点を角(x,y)と決めたときに,その点を角にした
正方形(左上(x,y)右下(x+m,y+m))のときにしか達成
できないような選び方を計算することで重複なく数え
られる
• そのような選び方は2パターンある(次スライド)
D問題 考察
• パターン1 : 選んだ角(x,y)に1つ以上の点がある
• パターン2 : 選んだ角(x,y)に点は無いが,(x,?)と(?,y)
に1つ以上ずつ点がある.
ケース1(3通り) ケース2(1通り)
↑4つの点がある適当な例(K=3とする)
D問題 考察
• 説明のために
– 正方形領域の全ての点の数をall
– 角(x,y)の点をcorner
– 左端領域の点と上端領域の点の数をleft,top
と表す
[パターン1の個数]
– nCr(all,K) - nCr(all-corner,K)
[パターン2の個数]
– nCr(number-corner,K)
- nCr(number-corner-top,K)
- ncr(number-corner-left,K)
+ nCr(number-corner-(top+left),K)
corner以外でKコ
cornerとtop以外でKコ
cornerとleft以外でKコ
cornerとleftとtop以外でKコ
(引きすぎた分を足す,包除原理)
D問題 アルゴリズム
• モンスターのパラメータの最大値をM(<=3000)とする
• Nコの点をプロットする → O(N)
• 二次元累積和を計算しておく → O(M^2)
• チームの不安定度の最小値mを二分探索で求める
→ 累積和を用いて O(M^2 log M)
• 組み合わせ数を求める
→ O(M^2)
nCrの計算は予め0≦k≦Nについてk!と(k!の逆元)をmod 10^9+7で計算しておく
ことでO(1)
• 全体として O(M^2 log M)

Contenu connexe

Tendances

AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説AtCoder Inc.
 
AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説AtCoder Inc.
 
AtCoder Beginner Contest 011 解説
AtCoder Beginner Contest 011 解説AtCoder Beginner Contest 011 解説
AtCoder Beginner Contest 011 解説AtCoder Inc.
 
DDPC 2016 予選 解説
DDPC 2016 予選 解説DDPC 2016 予選 解説
DDPC 2016 予選 解説AtCoder Inc.
 
AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Inc.
 
AtCoder Regular Contest 035 解説
AtCoder Regular Contest 035 解説AtCoder Regular Contest 035 解説
AtCoder Regular Contest 035 解説AtCoder Inc.
 
AtCoder Regular Contest 037 解説
AtCoder Regular Contest 037 解説AtCoder Regular Contest 037 解説
AtCoder Regular Contest 037 解説AtCoder Inc.
 
Arc015途中まで解説
Arc015途中まで解説Arc015途中まで解説
Arc015途中まで解説AtCoder Inc.
 
AtCoder Beginner Contest 006 解説
AtCoder Beginner Contest 006 解説AtCoder Beginner Contest 006 解説
AtCoder Beginner Contest 006 解説AtCoder Inc.
 
AtCoder Regular Contest 033 解説
AtCoder Regular Contest 033 解説AtCoder Regular Contest 033 解説
AtCoder Regular Contest 033 解説AtCoder Inc.
 
AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Inc.
 
AtCoder Beginner Contest 008 解説
AtCoder Beginner Contest 008 解説AtCoder Beginner Contest 008 解説
AtCoder Beginner Contest 008 解説AtCoder Inc.
 
AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説AtCoder Inc.
 
AtCoder Beginner Contest 005 解説
AtCoder Beginner Contest 005 解説AtCoder Beginner Contest 005 解説
AtCoder Beginner Contest 005 解説AtCoder Inc.
 
AtCoder Regular Contest 046
AtCoder Regular Contest 046AtCoder Regular Contest 046
AtCoder Regular Contest 046AtCoder Inc.
 

Tendances (20)

abc027
abc027abc027
abc027
 
AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説
 
abc032
abc032abc032
abc032
 
Abc009
Abc009Abc009
Abc009
 
AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説
 
AtCoder Beginner Contest 011 解説
AtCoder Beginner Contest 011 解説AtCoder Beginner Contest 011 解説
AtCoder Beginner Contest 011 解説
 
DDPC 2016 予選 解説
DDPC 2016 予選 解説DDPC 2016 予選 解説
DDPC 2016 予選 解説
 
AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説
 
AtCoder Regular Contest 035 解説
AtCoder Regular Contest 035 解説AtCoder Regular Contest 035 解説
AtCoder Regular Contest 035 解説
 
AtCoder Regular Contest 037 解説
AtCoder Regular Contest 037 解説AtCoder Regular Contest 037 解説
AtCoder Regular Contest 037 解説
 
Arc015途中まで解説
Arc015途中まで解説Arc015途中まで解説
Arc015途中まで解説
 
AtCoder Beginner Contest 006 解説
AtCoder Beginner Contest 006 解説AtCoder Beginner Contest 006 解説
AtCoder Beginner Contest 006 解説
 
AtCoder Regular Contest 033 解説
AtCoder Regular Contest 033 解説AtCoder Regular Contest 033 解説
AtCoder Regular Contest 033 解説
 
AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説
 
AtCoder Beginner Contest 008 解説
AtCoder Beginner Contest 008 解説AtCoder Beginner Contest 008 解説
AtCoder Beginner Contest 008 解説
 
AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説
 
abc031
abc031abc031
abc031
 
AtCoder Beginner Contest 005 解説
AtCoder Beginner Contest 005 解説AtCoder Beginner Contest 005 解説
AtCoder Beginner Contest 005 解説
 
AtCoder Regular Contest 046
AtCoder Regular Contest 046AtCoder Regular Contest 046
AtCoder Regular Contest 046
 
arc047
arc047arc047
arc047
 

Similaire à AtCoder Regular Contest 032 解説

AtCoder Beginner Contest 026 解説
AtCoder Beginner Contest 026 解説AtCoder Beginner Contest 026 解説
AtCoder Beginner Contest 026 解説AtCoder Inc.
 
Indeedなう 予選A 解説
Indeedなう 予選A 解説Indeedなう 予選A 解説
Indeedなう 予選A 解説AtCoder Inc.
 
AtCoder Beginner Contest 019 解説
AtCoder Beginner Contest 019 解説AtCoder Beginner Contest 019 解説
AtCoder Beginner Contest 019 解説AtCoder Inc.
 
AtCoder Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説AtCoder Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説AtCoder Inc.
 
Indeedなう 予選B 解説
Indeedなう 予選B 解説Indeedなう 予選B 解説
Indeedなう 予選B 解説AtCoder Inc.
 
AtCoder Beginner Contest 003 解説
AtCoder Beginner Contest 003 解説AtCoder Beginner Contest 003 解説
AtCoder Beginner Contest 003 解説AtCoder Inc.
 
Code iq×japanr 公開用
Code iq×japanr 公開用Code iq×japanr 公開用
Code iq×japanr 公開用Nobuaki Oshiro
 
AtCoder Regular Contest 026 解説
AtCoder Regular Contest 026 解説AtCoder Regular Contest 026 解説
AtCoder Regular Contest 026 解説AtCoder Inc.
 
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)AtCoder Inc.
 
8_C言語入門 - 条件分岐について(if-else if-else)
8_C言語入門 - 条件分岐について(if-else if-else)8_C言語入門 - 条件分岐について(if-else if-else)
8_C言語入門 - 条件分岐について(if-else if-else)bc_rikko
 
Pythonではじめる競技プログラミング
Pythonではじめる競技プログラミングPythonではじめる競技プログラミング
Pythonではじめる競技プログラミングcocodrips
 
AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説AtCoder Inc.
 
Rustで始める競技プログラミング
Rustで始める競技プログラミングRustで始める競技プログラミング
Rustで始める競技プログラミングNaoya Okanami
 
AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説AtCoder Inc.
 
Programming 学習のすすめ
Programming 学習のすすめProgramming 学習のすすめ
Programming 学習のすすめSayaka Tamura
 
Test-Driven Development for [Embedded] C by James Grenning at Agile Japan 2013
Test-Driven Development for [Embedded] C by James Grenning at Agile Japan 2013Test-Driven Development for [Embedded] C by James Grenning at Agile Japan 2013
Test-Driven Development for [Embedded] C by James Grenning at Agile Japan 2013Yohei Onishi
 
CODE THANKS FESTIVAL 2014 A日程 解説
CODE THANKS FESTIVAL 2014 A日程 解説CODE THANKS FESTIVAL 2014 A日程 解説
CODE THANKS FESTIVAL 2014 A日程 解説AtCoder Inc.
 
【解説】JOI 2019/2020 一次予選 最速非公式解説【競技プログラミング】
【解説】JOI 2019/2020 一次予選 最速非公式解説【競技プログラミング】【解説】JOI 2019/2020 一次予選 最速非公式解説【競技プログラミング】
【解説】JOI 2019/2020 一次予選 最速非公式解説【競技プログラミング】Proktmr
 

Similaire à AtCoder Regular Contest 032 解説 (20)

AtCoder Beginner Contest 026 解説
AtCoder Beginner Contest 026 解説AtCoder Beginner Contest 026 解説
AtCoder Beginner Contest 026 解説
 
Indeedなう 予選A 解説
Indeedなう 予選A 解説Indeedなう 予選A 解説
Indeedなう 予選A 解説
 
AtCoder Beginner Contest 019 解説
AtCoder Beginner Contest 019 解説AtCoder Beginner Contest 019 解説
AtCoder Beginner Contest 019 解説
 
AtCoder Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説AtCoder Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説
 
Indeedなう 予選B 解説
Indeedなう 予選B 解説Indeedなう 予選B 解説
Indeedなう 予選B 解説
 
AtCoder Beginner Contest 003 解説
AtCoder Beginner Contest 003 解説AtCoder Beginner Contest 003 解説
AtCoder Beginner Contest 003 解説
 
Code iq×japanr 公開用
Code iq×japanr 公開用Code iq×japanr 公開用
Code iq×japanr 公開用
 
Tokyo r27
Tokyo r27Tokyo r27
Tokyo r27
 
AtCoder Regular Contest 026 解説
AtCoder Regular Contest 026 解説AtCoder Regular Contest 026 解説
AtCoder Regular Contest 026 解説
 
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
 
8_C言語入門 - 条件分岐について(if-else if-else)
8_C言語入門 - 条件分岐について(if-else if-else)8_C言語入門 - 条件分岐について(if-else if-else)
8_C言語入門 - 条件分岐について(if-else if-else)
 
Pythonではじめる競技プログラミング
Pythonではじめる競技プログラミングPythonではじめる競技プログラミング
Pythonではじめる競技プログラミング
 
AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説
 
Rustで始める競技プログラミング
Rustで始める競技プログラミングRustで始める競技プログラミング
Rustで始める競技プログラミング
 
AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説
 
Programming 学習のすすめ
Programming 学習のすすめProgramming 学習のすすめ
Programming 学習のすすめ
 
Test-Driven Development for [Embedded] C by James Grenning at Agile Japan 2013
Test-Driven Development for [Embedded] C by James Grenning at Agile Japan 2013Test-Driven Development for [Embedded] C by James Grenning at Agile Japan 2013
Test-Driven Development for [Embedded] C by James Grenning at Agile Japan 2013
 
CODE THANKS FESTIVAL 2014 A日程 解説
CODE THANKS FESTIVAL 2014 A日程 解説CODE THANKS FESTIVAL 2014 A日程 解説
CODE THANKS FESTIVAL 2014 A日程 解説
 
Lt会01_uetch
Lt会01_uetchLt会01_uetch
Lt会01_uetch
 
【解説】JOI 2019/2020 一次予選 最速非公式解説【競技プログラミング】
【解説】JOI 2019/2020 一次予選 最速非公式解説【競技プログラミング】【解説】JOI 2019/2020 一次予選 最速非公式解説【競技プログラミング】
【解説】JOI 2019/2020 一次予選 最速非公式解説【競技プログラミング】
 

Plus de AtCoder Inc.

AtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組みAtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組みAtCoder Inc.
 
Square869120 contest #2
Square869120 contest #2Square869120 contest #2
Square869120 contest #2AtCoder Inc.
 
AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説AtCoder Inc.
 
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説AtCoder Inc.
 
Chokudai Contest 001
Chokudai Contest 001Chokudai Contest 001
Chokudai Contest 001AtCoder Inc.
 
AtCoder Regular Contest 048
AtCoder Regular Contest 048AtCoder Regular Contest 048
AtCoder Regular Contest 048AtCoder Inc.
 
MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説AtCoder Inc.
 
CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説AtCoder Inc.
 
CODE FESTIVAL 2015 解説
CODE FESTIVAL 2015 解説CODE FESTIVAL 2015 解説
CODE FESTIVAL 2015 解説AtCoder Inc.
 
CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説AtCoder Inc.
 
CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説AtCoder Inc.
 
AtCoder Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説AtCoder Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説AtCoder Inc.
 
天下一プログラマーコンテスト2015 予選B 解説
天下一プログラマーコンテスト2015 予選B 解説天下一プログラマーコンテスト2015 予選B 解説
天下一プログラマーコンテスト2015 予選B 解説AtCoder Inc.
 
AtCoder Regular Contest 043 解説
AtCoder Regular Contest 043 解説AtCoder Regular Contest 043 解説
AtCoder Regular Contest 043 解説AtCoder Inc.
 
天下一プログラマーコンテスト2015 予選A E問題 解説
天下一プログラマーコンテスト2015 予選A E問題 解説天下一プログラマーコンテスト2015 予選A E問題 解説
天下一プログラマーコンテスト2015 予選A E問題 解説AtCoder Inc.
 

Plus de AtCoder Inc. (16)

TCO2017R1
TCO2017R1TCO2017R1
TCO2017R1
 
AtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組みAtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組み
 
Square869120 contest #2
Square869120 contest #2Square869120 contest #2
Square869120 contest #2
 
AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説
 
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
 
Chokudai Contest 001
Chokudai Contest 001Chokudai Contest 001
Chokudai Contest 001
 
AtCoder Regular Contest 048
AtCoder Regular Contest 048AtCoder Regular Contest 048
AtCoder Regular Contest 048
 
MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説
 
CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説
 
CODE FESTIVAL 2015 解説
CODE FESTIVAL 2015 解説CODE FESTIVAL 2015 解説
CODE FESTIVAL 2015 解説
 
CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説
 
CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説
 
AtCoder Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説AtCoder Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説
 
天下一プログラマーコンテスト2015 予選B 解説
天下一プログラマーコンテスト2015 予選B 解説天下一プログラマーコンテスト2015 予選B 解説
天下一プログラマーコンテスト2015 予選B 解説
 
AtCoder Regular Contest 043 解説
AtCoder Regular Contest 043 解説AtCoder Regular Contest 043 解説
AtCoder Regular Contest 043 解説
 
天下一プログラマーコンテスト2015 予選A E問題 解説
天下一プログラマーコンテスト2015 予選A E問題 解説天下一プログラマーコンテスト2015 予選A E問題 解説
天下一プログラマーコンテスト2015 予選A E問題 解説
 

Dernier

My Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdf
My Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdfMy Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdf
My Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdfinspirehighstaff03
 
Divorce agreements in administrative work.pdf
Divorce agreements in administrative work.pdfDivorce agreements in administrative work.pdf
Divorce agreements in administrative work.pdfoganekyokoi
 
Establishment and operation of medical corporations.pdf
Establishment and operation of medical corporations.pdfEstablishment and operation of medical corporations.pdf
Establishment and operation of medical corporations.pdfoganekyokoi
 
My Inspire High Award 2024 「本当の『悪者』って何?」
My Inspire High Award 2024 「本当の『悪者』って何?」My Inspire High Award 2024 「本当の『悪者』って何?」
My Inspire High Award 2024 「本当の『悪者』って何?」inspirehighstaff03
 
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライドリアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライドKen Fukui
 
My Inspire High Award 2024「老いることは不幸なこと?」
My Inspire High Award 2024「老いることは不幸なこと?」My Inspire High Award 2024「老いることは不幸なこと?」
My Inspire High Award 2024「老いることは不幸なこと?」inspirehighstaff03
 
My Inspire High Award 2024  「正義って存在するの?」
My Inspire High Award 2024  「正義って存在するの?」My Inspire High Award 2024  「正義って存在するの?」
My Inspire High Award 2024  「正義って存在するの?」inspirehighstaff03
 
What I did before opening my business..pdf
What I did before opening my business..pdfWhat I did before opening my business..pdf
What I did before opening my business..pdfoganekyokoi
 
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライドリアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライドKen Fukui
 
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライドリアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライドKen Fukui
 
My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」
My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」
My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」inspirehighstaff03
 
My Inspire High Award 2024    「孤独は敵なのか?」
My Inspire High Award 2024    「孤独は敵なのか?」My Inspire High Award 2024    「孤独は敵なのか?」
My Inspire High Award 2024    「孤独は敵なのか?」inspirehighstaff03
 
My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」
My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」
My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」inspirehighstaff03
 
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slidessusere0a682
 
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライドリアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライドKen Fukui
 
My Inspire High Award 2024「なぜ人は他人と違うところがあってもそれをなかなか誇れないのか?」
My Inspire High Award 2024「なぜ人は他人と違うところがあってもそれをなかなか誇れないのか?」My Inspire High Award 2024「なぜ人は他人と違うところがあってもそれをなかなか誇れないのか?」
My Inspire High Award 2024「なぜ人は他人と違うところがあってもそれをなかなか誇れないのか?」inspirehighstaff03
 
TEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdfTEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdfyukisuga3
 
My Inspire High Award 2024「なぜ議会への関心が低いのか?」
My Inspire High Award 2024「なぜ議会への関心が低いのか?」My Inspire High Award 2024「なぜ議会への関心が低いのか?」
My Inspire High Award 2024「なぜ議会への関心が低いのか?」inspirehighstaff03
 
My Inspire High Award 2024      「家族とは何か」
My Inspire High Award 2024      「家族とは何か」My Inspire High Award 2024      「家族とは何か」
My Inspire High Award 2024      「家族とは何か」inspirehighstaff03
 
My Inspire High Award 2024「他者と自分、対立を防ぐには?」
My Inspire High Award 2024「他者と自分、対立を防ぐには?」My Inspire High Award 2024「他者と自分、対立を防ぐには?」
My Inspire High Award 2024「他者と自分、対立を防ぐには?」inspirehighstaff03
 

Dernier (20)

My Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdf
My Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdfMy Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdf
My Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdf
 
Divorce agreements in administrative work.pdf
Divorce agreements in administrative work.pdfDivorce agreements in administrative work.pdf
Divorce agreements in administrative work.pdf
 
Establishment and operation of medical corporations.pdf
Establishment and operation of medical corporations.pdfEstablishment and operation of medical corporations.pdf
Establishment and operation of medical corporations.pdf
 
My Inspire High Award 2024 「本当の『悪者』って何?」
My Inspire High Award 2024 「本当の『悪者』って何?」My Inspire High Award 2024 「本当の『悪者』って何?」
My Inspire High Award 2024 「本当の『悪者』って何?」
 
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライドリアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
 
My Inspire High Award 2024「老いることは不幸なこと?」
My Inspire High Award 2024「老いることは不幸なこと?」My Inspire High Award 2024「老いることは不幸なこと?」
My Inspire High Award 2024「老いることは不幸なこと?」
 
My Inspire High Award 2024  「正義って存在するの?」
My Inspire High Award 2024  「正義って存在するの?」My Inspire High Award 2024  「正義って存在するの?」
My Inspire High Award 2024  「正義って存在するの?」
 
What I did before opening my business..pdf
What I did before opening my business..pdfWhat I did before opening my business..pdf
What I did before opening my business..pdf
 
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライドリアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
 
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライドリアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
 
My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」
My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」
My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」
 
My Inspire High Award 2024    「孤独は敵なのか?」
My Inspire High Award 2024    「孤独は敵なのか?」My Inspire High Award 2024    「孤独は敵なのか?」
My Inspire High Award 2024    「孤独は敵なのか?」
 
My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」
My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」
My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」
 
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide
 
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライドリアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
 
My Inspire High Award 2024「なぜ人は他人と違うところがあってもそれをなかなか誇れないのか?」
My Inspire High Award 2024「なぜ人は他人と違うところがあってもそれをなかなか誇れないのか?」My Inspire High Award 2024「なぜ人は他人と違うところがあってもそれをなかなか誇れないのか?」
My Inspire High Award 2024「なぜ人は他人と違うところがあってもそれをなかなか誇れないのか?」
 
TEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdfTEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdf
 
My Inspire High Award 2024「なぜ議会への関心が低いのか?」
My Inspire High Award 2024「なぜ議会への関心が低いのか?」My Inspire High Award 2024「なぜ議会への関心が低いのか?」
My Inspire High Award 2024「なぜ議会への関心が低いのか?」
 
My Inspire High Award 2024      「家族とは何か」
My Inspire High Award 2024      「家族とは何か」My Inspire High Award 2024      「家族とは何か」
My Inspire High Award 2024      「家族とは何か」
 
My Inspire High Award 2024「他者と自分、対立を防ぐには?」
My Inspire High Award 2024「他者と自分、対立を防ぐには?」My Inspire High Award 2024「他者と自分、対立を防ぐには?」
My Inspire High Award 2024「他者と自分、対立を防ぐには?」
 

AtCoder Regular Contest 032 解説

  • 1. AtCoder Regular Contest 032 解説 AtCoder株式会社 代表取締役 高橋 直大 2015/1/3 1
  • 3. ©AtCoder Inc. All rights reserved. 3 A問題 ホリドッグ 1. 問題概要 2. アルゴリズム 2015/1/3 3
  • 4. A問題 問題概要 • Nが与えられる • 1+2+…+Nの素数判定せよ • 制約 – 1 ≦ N ≦ 999 2015/1/3 4
  • 5. A問題 アルゴリズム • 解法1 – S=1+2+…+Nをforループで計算する • N=1000のとき最大でS=1+2+…+1000 = 500500 – それに対して素数判定をforループで行う • 2~S-1の範囲でSを割り切る数がないか確かめる • 解法2 – S=1+2+…+N= 𝑁 𝑁+1 2 (総和の公式) • 式から明らかにNが小さいとき以外は素数にならなさそう – N=1のときは1なので素数ではない – N=2のときは素数 – N>2のとき常に合成数 • N=2のときだけ素数,それ以外のとき非素数なので, その事実にしたがって出力すればよい 2015/1/3 5
  • 6. ©AtCoder Inc. All rights reserved. 6 B問題 道路工事 1. 問題概要 2. アルゴリズム 2015/1/3 6
  • 7. B問題 問題概要 • N 頂点 M 辺の無向グラフが与えられる • グラフに最小でいくつ辺を追加すれば、全体がつな がるか調べる • 制約 – 0 ≦ N,M ≦ 100000 2015/1/3 7
  • 8. B問題 アルゴリズム • 考察 – グラフのつながっている部分がK個あるとき、最小でK-1本 の辺があれば全体をつなげられる。 – 1本つながっていない部分の間に辺を追加すると、Kは1減 るから。 2015/1/3 8 黒がもともとある道路 このとき、K=3 2本の赤の辺を追加すれば全 体がつながる
  • 9. B問題 アルゴリズム • なので、グラフのつながっている部分(連結成分と呼 ばれる)の数を数えればよい。 • 解法1 – Union-Findですべての辺をつないだ後、Union-Find木での root の数を数える(具体的には、頂点 v のrootが v のもの を数えると楽。連結成分ごとに root は共通で、自身が root となるものがちょうど 1 つあるから) • 解法2 – 今まででまだ訪れていない頂点を見つけたら、 DFSを使い そこから行ける頂点をすべて訪れて、連結成分の数を1つ 加える etc… • どちらも(ほぼ)線形時間 2015/1/3 9
  • 10. ©AtCoder Inc. All rights reserved. 10 C問題 仕事計画 1. 問題概要 2. アルゴリズム 2015/1/3 10
  • 11. C問題 問題概要 • 時刻の区間がN個与えられます。区間は順に1から Nまで番号付けられています。 • i 番目の区間は a_i から b_i まで。 • 互いに被らない条件の下で、なるべく多くの区間を 選びたい(端点は被ってもOK) • 複数あるときは、区間の早い順に並べた時の辞書 順最小となるものを1つ出力。 • 制約 – 0 ≦ a_i, b_i ≦ 1000000 – 1 ≦ N ≦ 100000 2015/1/3 11
  • 12. C問題 アルゴリズム • これ蟻本でやったやつだ!(区間スケジューリング問 題, p43) – 蟻本を読もう! – 具体的には、終了時間が早い順にソートし、貪欲に区間 を選んで行けば、区間数最大の解が1つ得られる • しかし、辞書順最小での構成を1つ出力しなければ ならない • なるべく多く取れる取り方のうち、辞書順最小のもの を求めるときは、最初に取れるものを最小化し続け る必要がある 2015/1/3 12
  • 13. C問題 アルゴリズム • 時刻 i それぞれに対し、(i 以降で最大でいくつ取れ るか?,最大の取り方のうち、次に取れる最小の仕事 の番号はいくつか?) のペアが更新すればできそう – i から始めるとき、次に取る区間は辞書順最小の条件か ら、(最大の取り方のうち、次に取れる最小の仕事の番号) となるから • このペアを dp[i] とおく 2015/1/3 13
  • 14. C問題 アルゴリズム • dp[i] を求めるとき、 – 時刻 i から始まる区間を使うとき、時刻 i から始まり、b で終わ る番号idの区間を使う場合、 (b以降で取れる区間の最大数 +1,id) が候補 – 時刻 i から始まる区間を使わないとき、(時刻 i+1 以降で取れる 区間の最大数, そのうちの最小の仕事の番号) が候補 – 以上のペアから、取れる区間の最大数で比較し、多いものを選 ぶ。それが同じなら、次に取る仕事の番号が小さいものを選ぶ。 • 番号が同じ区間はないので、このペアが同じになることは無い • 以上のことから、dp[i] の更新に必要なのは i+1 以降の dpの情報 • よって、dp[i] を後ろから更新していけばよい 2015/1/3 14
  • 15. C問題 アルゴリズム • dp[0] が求まったら、0 以降で取れる区間の最大数 が1つ目の答え。 • 復元するときは、今の時刻以降で最大の取り方のう ち最小の番号の区間をとり続けていく – dp のペアの2番目の情報にこれがそのまま入っている – 最初に “今の時刻”=0 とし、次に取る区間を答えに追加 し、”今の時刻”を最後に取った区間の終端に更新 – これを、取れる区間が無くなるまで繰り返す • 合計でもO(N)! 2015/1/3 15
  • 16. ©AtCoder Inc. All rights reserved. 16 D問題 アットコーダーモンスターズ 1. 問題概要 2. 考察 3. アルゴリズム 2015/1/3 16
  • 17. D問題 問題概要 • N匹のモンスターがいる • 各モンスターには攻撃力と防御力というパラメータがある • ちょうどK匹のモンスターを買いたい • あるモンスターの対について,攻撃力の差と防御力の差の 最大値を不安定度と定義 • K匹からなるチームに含まれるペアの不安定度の最大値 (=チームの不安定度)を最小化し,それを達成する組み合わ せ数 mod 100000007 を出力しろ. • 制約 – 1 ≦ K ≦ N ≦ 100,000 – 0 ≦ 各モンスターの防御力,攻撃力 ≦ 3000 2015/1/3 17
  • 18. D問題 考察 • まず,チームの不安定度の最小値を求めたい. • モンスターの(攻撃力,防御力)を二次元平面に点とし てプロットしてみる • あるチームの不安定度をxと決めたとき, – 一辺xの正方形領域に含まれる点の数がK以上であるようなところ が存在すれば,不安定度x以下にできることが分かる. • これで二分探索したらよさそう. • 任意の正方形領域に含まれる点の数を高速に計算 するため,予め二次元累積和を計算しておく.
  • 19. D問題 考察 • 次にチームの不安定度の最小値mを達成する組み 合わせ数を求めたい. • 単純に全ての領域に対してKコを選ぶ組み合わせの 数を計算するのは,重複が発生しダメ. • ある点を角(x,y)と決めたときに,その点を角にした 正方形(左上(x,y)右下(x+m,y+m))のときにしか達成 できないような選び方を計算することで重複なく数え られる • そのような選び方は2パターンある(次スライド)
  • 20. D問題 考察 • パターン1 : 選んだ角(x,y)に1つ以上の点がある • パターン2 : 選んだ角(x,y)に点は無いが,(x,?)と(?,y) に1つ以上ずつ点がある. ケース1(3通り) ケース2(1通り) ↑4つの点がある適当な例(K=3とする)
  • 21. D問題 考察 • 説明のために – 正方形領域の全ての点の数をall – 角(x,y)の点をcorner – 左端領域の点と上端領域の点の数をleft,top と表す [パターン1の個数] – nCr(all,K) - nCr(all-corner,K) [パターン2の個数] – nCr(number-corner,K) - nCr(number-corner-top,K) - ncr(number-corner-left,K) + nCr(number-corner-(top+left),K) corner以外でKコ cornerとtop以外でKコ cornerとleft以外でKコ cornerとleftとtop以外でKコ (引きすぎた分を足す,包除原理)
  • 22. D問題 アルゴリズム • モンスターのパラメータの最大値をM(<=3000)とする • Nコの点をプロットする → O(N) • 二次元累積和を計算しておく → O(M^2) • チームの不安定度の最小値mを二分探索で求める → 累積和を用いて O(M^2 log M) • 組み合わせ数を求める → O(M^2) nCrの計算は予め0≦k≦Nについてk!と(k!の逆元)をmod 10^9+7で計算しておく ことでO(1) • 全体として O(M^2 log M)