SlideShare ist ein Scribd-Unternehmen logo
1 von 13
Downloaden Sie, um offline zu lesen
会津合宿 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

Weitere ähnliche Inhalte

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

Mehr von 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: 矢
 

Kürzlich hochgeladen

モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 

Kürzlich hochgeladen (8)

モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 

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