SlideShare a Scribd company logo
1 of 13
Download to read offline
会津合宿 2017 Day3
G: ほぼ無限グリコ
●
原案 : 杉江
●
問題文 : 杉江
●
解答 : 杉江・栗田・鈴木
●
解説 : 杉江
会津合宿 2017 Day3 G: ほぼ無限グリコ 解説 2017 / 9 / 20
問題概要
●
N マスからなる円環状のフィールドがある
●
グリコ (階段でやる遊び) の要領でじゃんけんを K 回行う

特殊なじゃんけんを用いてプレイするため、勝ち方は M 通り
 i 番目の勝ち方で勝った場合は pi
マス進み、負けた場合はそ
の場にとどまる
●
K 回のじゃんけんを終えたあとに、 i 番目のマスにいる場合の
数 mod 1,000,000,007 を、それぞれのマスについて求める
会津合宿 2017 Day3 G: ほぼ無限グリコ 解説 2017 / 9 / 20
想定誤解法
●
想定誤解法は、ちょっと効率の悪い DP
●
dp[i][j] := i 番目のじゃんけんを終えたあとに、 j 番目のマスにい
る場合の数

遷移行列 D ( 任意のマス対 (u, v) に対して、 u 番目のマスから 1
回のじゃんけんで v 番目のマスへ到達する場合の数 D[v][u] を行列
で表したもの ) を作ると、任意のマス x に対して
(dp[i+1][j] += D[j][x] * dp[i][x]) %= MOD と更新可能
会津合宿 2017 Day3 G: ほぼ無限グリコ 解説 2017 / 9 / 20
dp[i][x] dp[i+1][j]
●
i 回目のじゃんけん終了時に
●
マス x にいる
●
(i+1) 回目のじゃんけん終了時に
●
マス j にいる
x から j に「遷移」
D[j][x]
遷移行列
●
遷移行列の作り方 → 任意のマス対 (u, v) に対して、 u 番目のマスか
ら 1 回のじゃんけんで v 番目のマスへ到達する場合の数 D[v][u] を
行列で表す
●
例 : N = 3, 勝ち方 ( 進めるマス数 ) = 1, 2, 5

実はこれはまだ不十分
会津合宿 2017 Day3 G: ほぼ無限グリコ 解説 2017 / 9 / 20
遷移行列
●
遷移行列の作り方 → 任意のマス対 (u, v) に対して、 u 番目のマスか
ら 1 回のじゃんけんで v 番目のマスへ到達する場合の数 D[v][u] を
行列で表す
●
例 : N = 3, 勝ち方 ( 進めるマス数 ) = 1, 2, 5

「負けた時はその場にとどまる」を入れ忘れないように!

対角成分に +1
会津合宿 2017 Day3 G: ほぼ無限グリコ 解説 2017 / 9 / 20
想定誤解法
●
想定誤解法は、ちょっと効率の悪い DP
●
dp[i][j] := i 番目のじゃんけんを終えたあとに、 j 番目のマスにい
る場合の数

遷移行列 D ( 任意のマス対 (u, v) に対して、 u 番目のマスから 1
回のじゃんけんで v 番目のマスへ到達する場合の数 D[v][u] を行列
で表したもの ) を作ると、任意のマス x に対して
(dp[i+1][j] += D[j][x] * dp[i][x]) %= MOD と更新可能

直前の情報だけわかっていれば良いので最初の次元は配列の使い回し
で削減でき、空間計算量的には O(N) なので問題ない

しかし、時間計算量は O(N2
K) であり、到底間に合わないため、別
のアプローチが必要
会津合宿 2017 Day3 G: ほぼ無限グリコ 解説 2017 / 9 / 20
方針 1
●
さっきの DP の更新式をもう一度見てみよう
● (dp[i+1][j] += D[j][x] * dp[i][x]) %= MOD
●
細かいことを省略して数式で書き直すとこうなる
●
これを高速化するには、なにが使えるか?

行列を使ってみよう!
会津合宿 2017 Day3 G: ほぼ無限グリコ 解説 2017 / 9 / 20
方針 1
●
DP 配列を縦ベクトルとみなすと、先ほどの式
●
これは行列の積で表せる!
会津合宿 2017 Day3 G: ほぼ無限グリコ 解説 2017 / 9 / 20
方針 1
●
ベクトル dp に対して、行列 D を 1 回掛けると次の状態
( じゃんけんをもう 1 回した後の場合の数 ) に行くことがわ
かった
●
K 回のじゃんけんを行ったあとの場合の数を知りたいのだから、
D を K 回掛けたい (D を K 乗したい ) 気持ちになる
●
これは、行列累乗で高速化できる! ( 詳細 : 蟻本 P.180)
●
この方針をとることで O(N3
log K) になる
会津合宿 2017 Day3 G: ほぼ無限グリコ 解説 2017 / 9 / 20
方針 1
●
ベクトル dp に対して、行列 D を 1 回掛けると次の状態
( じゃんけんをもう 1 回した後の場合の数 ) に行くことがわ
かった
●
K 回のじゃんけんを行ったあとの場合の数を知りたいのだから、
D を K 回掛けたい (D を K 乗したい ) 気持ちになる
●
これは、行列累乗で高速化できる! ( 詳細 : 蟻本 P.180)
●
この方針をとることで O(N3
log K) になる

実はこれでもまだダメ!! ( 最悪 1.5 × 1010
回くらいの計算 )
会津合宿 2017 Day3 G: ほぼ無限グリコ 解説 2017 / 9 / 20
方針 2
●
遷移行列 D がどんな形の行列なのかを考えてみる
●
D の例
● どのマスにいたとしても「 w 番目の勝ち方をすると pw
進む」
のだから、 D の各行について、 1 つ前の行の要素を 1 つずつ
ずらしたものと同じになる
●
このような行列を巡回行列という
会津合宿 2017 Day3 G: ほぼ無限グリコ 解説 2017 / 9 / 20
方針 2
●
巡回行列の性質 → 任意の 2 つの巡回行列 A と B について、
その積 AB も巡回行列になる
●
この性質により、 dp ベクトルに掛けられる行列は常に巡回行列
であることがわかる
●
巡回行列の積は、最初の行だけ普通に計算して 2 行目以降は前
の行をずらして埋めることで O(N2
) で計算が可能
●
よって、 O(N2
log K) に落とすことができる!
●
これが想定解法です
会津合宿 2017 Day3 G: ほぼ無限グリコ 解説 2017 / 9 / 20
Writer 解 & 統計
●
Writer 解

杉江 : 1994 bytes, 91 lines (C++)

栗田 : 898 bytes, 41 lines (C++)

鈴木 : 1213 bytes, 49 lines (C++)
●
Accept / Submission

?? % (?? / ??)
●
First Acceptance

On-site : ???? (?? min)

On-line : ???? (?? min)
会津合宿 2017 Day3 G: ほぼ無限グリコ 解説 2017 / 9 / 20

More Related Content

More from HCPC: 北海道大学競技プログラミングサークル

More from HCPC: 北海道大学競技プログラミングサークル (20)

ACPC 2019 Day3 G: Restricted DFS
ACPC 2019 Day3 G: Restricted DFSACPC 2019 Day3 G: Restricted DFS
ACPC 2019 Day3 G: Restricted DFS
 
ACPC 2019 Day3 F: 部分文字列分解
ACPC 2019 Day3 F: 部分文字列分解ACPC 2019 Day3 F: 部分文字列分解
ACPC 2019 Day3 F: 部分文字列分解
 
ACPC 2019 Day3 E: 総和の切り取り
ACPC 2019 Day3 E: 総和の切り取りACPC 2019 Day3 E: 総和の切り取り
ACPC 2019 Day3 E: 総和の切り取り
 
ACPC 2019 Day3 B: パフェ
ACPC 2019 Day3 B: パフェACPC 2019 Day3 B: パフェ
ACPC 2019 Day3 B: パフェ
 
ACPC 2019 Day3 A: 間違い探し
ACPC 2019 Day3 A: 間違い探しACPC 2019 Day3 A: 間違い探し
ACPC 2019 Day3 A: 間違い探し
 
HUPC 2019 Day2 G: 木
HUPC 2019 Day2 G: 木HUPC 2019 Day2 G: 木
HUPC 2019 Day2 G: 木
 
HUPC 2019 Day2 E: ジャム
HUPC 2019 Day2 E: ジャムHUPC 2019 Day2 E: ジャム
HUPC 2019 Day2 E: ジャム
 
HUPC 2019 Day2 H: Revenge of UMG
HUPC 2019 Day2 H: Revenge of UMGHUPC 2019 Day2 H: Revenge of UMG
HUPC 2019 Day2 H: Revenge of UMG
 
HUPC 2019 Day2 F: MOD Rush
HUPC 2019 Day2 F: MOD RushHUPC 2019 Day2 F: MOD Rush
HUPC 2019 Day2 F: MOD Rush
 
HUPC 2019 Day2 C: 串刺し
HUPC 2019 Day2 C: 串刺しHUPC 2019 Day2 C: 串刺し
HUPC 2019 Day2 C: 串刺し
 
HUPC 2019 Day1 F: グリッドの番号
HUPC 2019 Day1 F: グリッドの番号HUPC 2019 Day1 F: グリッドの番号
HUPC 2019 Day1 F: グリッドの番号
 
HUPC 2019 Day1 E: 最短経路の復元
HUPC 2019 Day1 E: 最短経路の復元HUPC 2019 Day1 E: 最短経路の復元
HUPC 2019 Day1 E: 最短経路の復元
 
HUPC 2019 Day1 D: 貪欲が最適?
HUPC 2019 Day1 D: 貪欲が最適?HUPC 2019 Day1 D: 貪欲が最適?
HUPC 2019 Day1 D: 貪欲が最適?
 
HUPC 2019 Day1 C: 短絡評価
HUPC 2019 Day1 C: 短絡評価HUPC 2019 Day1 C: 短絡評価
HUPC 2019 Day1 C: 短絡評価
 
HUPC 2019 Day1 B: 自身の 2 倍
HUPC 2019 Day1 B: 自身の 2 倍HUPC 2019 Day1 B: 自身の 2 倍
HUPC 2019 Day1 B: 自身の 2 倍
 
HUPC 2019 Day1 A: four tea
HUPC 2019 Day1 A: four teaHUPC 2019 Day1 A: four tea
HUPC 2019 Day1 A: four tea
 
Convex Hull Trick
Convex Hull TrickConvex Hull Trick
Convex Hull Trick
 
プログラミングコンテスト基礎テクニック
プログラミングコンテスト基礎テクニックプログラミングコンテスト基礎テクニック
プログラミングコンテスト基礎テクニック
 
RUPC 2019 Day3 G: Donuts Orientation
RUPC 2019 Day3 G: Donuts OrientationRUPC 2019 Day3 G: Donuts Orientation
RUPC 2019 Day3 G: Donuts Orientation
 
RUPC 2019 Day3 D: 矢
RUPC 2019 Day3 D: 矢RUPC 2019 Day3 D: 矢
RUPC 2019 Day3 D: 矢
 

Recently uploaded

Recently uploaded (10)

Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 

Aizu-2017:G

  • 1. 会津合宿 2017 Day3 G: ほぼ無限グリコ ● 原案 : 杉江 ● 問題文 : 杉江 ● 解答 : 杉江・栗田・鈴木 ● 解説 : 杉江 会津合宿 2017 Day3 G: ほぼ無限グリコ 解説 2017 / 9 / 20
  • 2. 問題概要 ● N マスからなる円環状のフィールドがある ● グリコ (階段でやる遊び) の要領でじゃんけんを K 回行う  特殊なじゃんけんを用いてプレイするため、勝ち方は M 通り  i 番目の勝ち方で勝った場合は pi マス進み、負けた場合はそ の場にとどまる ● K 回のじゃんけんを終えたあとに、 i 番目のマスにいる場合の 数 mod 1,000,000,007 を、それぞれのマスについて求める 会津合宿 2017 Day3 G: ほぼ無限グリコ 解説 2017 / 9 / 20
  • 3. 想定誤解法 ● 想定誤解法は、ちょっと効率の悪い DP ● dp[i][j] := i 番目のじゃんけんを終えたあとに、 j 番目のマスにい る場合の数  遷移行列 D ( 任意のマス対 (u, v) に対して、 u 番目のマスから 1 回のじゃんけんで v 番目のマスへ到達する場合の数 D[v][u] を行列 で表したもの ) を作ると、任意のマス x に対して (dp[i+1][j] += D[j][x] * dp[i][x]) %= MOD と更新可能 会津合宿 2017 Day3 G: ほぼ無限グリコ 解説 2017 / 9 / 20 dp[i][x] dp[i+1][j] ● i 回目のじゃんけん終了時に ● マス x にいる ● (i+1) 回目のじゃんけん終了時に ● マス j にいる x から j に「遷移」 D[j][x]
  • 4. 遷移行列 ● 遷移行列の作り方 → 任意のマス対 (u, v) に対して、 u 番目のマスか ら 1 回のじゃんけんで v 番目のマスへ到達する場合の数 D[v][u] を 行列で表す ● 例 : N = 3, 勝ち方 ( 進めるマス数 ) = 1, 2, 5  実はこれはまだ不十分 会津合宿 2017 Day3 G: ほぼ無限グリコ 解説 2017 / 9 / 20
  • 5. 遷移行列 ● 遷移行列の作り方 → 任意のマス対 (u, v) に対して、 u 番目のマスか ら 1 回のじゃんけんで v 番目のマスへ到達する場合の数 D[v][u] を 行列で表す ● 例 : N = 3, 勝ち方 ( 進めるマス数 ) = 1, 2, 5  「負けた時はその場にとどまる」を入れ忘れないように!  対角成分に +1 会津合宿 2017 Day3 G: ほぼ無限グリコ 解説 2017 / 9 / 20
  • 6. 想定誤解法 ● 想定誤解法は、ちょっと効率の悪い DP ● dp[i][j] := i 番目のじゃんけんを終えたあとに、 j 番目のマスにい る場合の数  遷移行列 D ( 任意のマス対 (u, v) に対して、 u 番目のマスから 1 回のじゃんけんで v 番目のマスへ到達する場合の数 D[v][u] を行列 で表したもの ) を作ると、任意のマス x に対して (dp[i+1][j] += D[j][x] * dp[i][x]) %= MOD と更新可能  直前の情報だけわかっていれば良いので最初の次元は配列の使い回し で削減でき、空間計算量的には O(N) なので問題ない  しかし、時間計算量は O(N2 K) であり、到底間に合わないため、別 のアプローチが必要 会津合宿 2017 Day3 G: ほぼ無限グリコ 解説 2017 / 9 / 20
  • 7. 方針 1 ● さっきの DP の更新式をもう一度見てみよう ● (dp[i+1][j] += D[j][x] * dp[i][x]) %= MOD ● 細かいことを省略して数式で書き直すとこうなる ● これを高速化するには、なにが使えるか?  行列を使ってみよう! 会津合宿 2017 Day3 G: ほぼ無限グリコ 解説 2017 / 9 / 20
  • 9. 方針 1 ● ベクトル dp に対して、行列 D を 1 回掛けると次の状態 ( じゃんけんをもう 1 回した後の場合の数 ) に行くことがわ かった ● K 回のじゃんけんを行ったあとの場合の数を知りたいのだから、 D を K 回掛けたい (D を K 乗したい ) 気持ちになる ● これは、行列累乗で高速化できる! ( 詳細 : 蟻本 P.180) ● この方針をとることで O(N3 log K) になる 会津合宿 2017 Day3 G: ほぼ無限グリコ 解説 2017 / 9 / 20
  • 10. 方針 1 ● ベクトル dp に対して、行列 D を 1 回掛けると次の状態 ( じゃんけんをもう 1 回した後の場合の数 ) に行くことがわ かった ● K 回のじゃんけんを行ったあとの場合の数を知りたいのだから、 D を K 回掛けたい (D を K 乗したい ) 気持ちになる ● これは、行列累乗で高速化できる! ( 詳細 : 蟻本 P.180) ● この方針をとることで O(N3 log K) になる  実はこれでもまだダメ!! ( 最悪 1.5 × 1010 回くらいの計算 ) 会津合宿 2017 Day3 G: ほぼ無限グリコ 解説 2017 / 9 / 20
  • 11. 方針 2 ● 遷移行列 D がどんな形の行列なのかを考えてみる ● D の例 ● どのマスにいたとしても「 w 番目の勝ち方をすると pw 進む」 のだから、 D の各行について、 1 つ前の行の要素を 1 つずつ ずらしたものと同じになる ● このような行列を巡回行列という 会津合宿 2017 Day3 G: ほぼ無限グリコ 解説 2017 / 9 / 20
  • 12. 方針 2 ● 巡回行列の性質 → 任意の 2 つの巡回行列 A と B について、 その積 AB も巡回行列になる ● この性質により、 dp ベクトルに掛けられる行列は常に巡回行列 であることがわかる ● 巡回行列の積は、最初の行だけ普通に計算して 2 行目以降は前 の行をずらして埋めることで O(N2 ) で計算が可能 ● よって、 O(N2 log K) に落とすことができる! ● これが想定解法です 会津合宿 2017 Day3 G: ほぼ無限グリコ 解説 2017 / 9 / 20
  • 13. Writer 解 & 統計 ● Writer 解  杉江 : 1994 bytes, 91 lines (C++)  栗田 : 898 bytes, 41 lines (C++)  鈴木 : 1213 bytes, 49 lines (C++) ● Accept / Submission  ?? % (?? / ??) ● First Acceptance  On-site : ???? (?? min)  On-line : ???? (?? min) 会津合宿 2017 Day3 G: ほぼ無限グリコ 解説 2017 / 9 / 20