SlideShare ist ein Scribd-Unternehmen logo
1 von 36
SuperCon2010予選問題アルゴリズム解説 3S 大城泰平 2010/06/21(月)
Problem Statement (横, 縦)=(n, 2)の長方形に(1, 2)(2, 1)の長方形を敷き詰める 敷き詰め方のパターン数をkで割った余りを出力 BoundaryCondition 入力されるn, kの数は600000個 1≦n≦32767 2≦k≦32767 問A
n=1の場合 (1通り) n=2の場合(2通り) n=3の場合 (3通り) n=4の場合 (5通り) n=5の場合 (8通り) まずは列挙してみる
n=6の場合 (13通り) 表にしてみると… あれ?なんかフィボナッチ数列っぽいかも? まずは列挙してみる
n=6の敷き詰め方の右端に注目してみる 二種類に分類出来る 考察1 B A
Aグループ 右端のブロックは「全て」縦に1つ ⇒ Aグループの数 = 右端以外の部分を敷き詰める通り数 これはn=5の時の通り数に等しい Bグループ 右端のブロックは「全て」横に2つ ⇒ Bグループの数 = 右端以外の部分を敷き詰める通り数 これはn=4の時の通り数に等しい これより (n=6の通り数)=(n=5の通り数)+(n=4の通り数) 考察2
これはn=6に限らず、一般に成り立つので (n=iの通り数) = (n=i-1の通り数) + (n=i-2の通り数) n=iの時の通り数をFiと置くと Fi=1   (i=1)2       (i=2)Fi−1+Fi−2 (otherwise) やっぱりフィボナッチ数列だった!      (一般のフィボナッチ数列と1つずれていることに注意。)   A解法
Problem Statement (横, 縦)=(m, 3)の長方形に(1, 2)(2, 1)の長方形を敷き詰める 敷き詰め方のパターン数をkで割った余りを出力 BoundaryCondition 入力されるm, kの数は600000個 1≦m≦32767 2≦k≦32767 問B
縦の長さが奇数 敷き詰める板の面積は2cm2 より偶数 mが奇数の時、(奇数)×(奇数)=(奇数)より面積も奇数 偶数の整数倍は偶数なので、どうやっても敷き詰められない⇔通り数=0 これ以降はmが偶数だと仮定して話を進める 問Aと同じように、右端に注目してみる 長方形だけでなく、いろいろな形の右端について考える 最長の行と最短の行の差が2未満という条件を付けると問Aは長方形以外に存在し得なかったが、問Bでは存在し得る ->まずは「右端の形」について考察する   考察1
右端の形を全通り列挙 それぞれの形について考察する 形2, 3, 4 mが偶数なので図形の面積が奇数になる   ⇒このように敷き詰めることは出来ない 考察2
形6 まず右端の出っ張ったところに横向きに配置 上下に隅が出来るのでそこに横向きに配置 mが2小さくなった形6がまた現れる これを繰り返すとm=2の形6になる m=2の形6を敷き詰めることは出来ない ⇒全てのmに於いて形6を敷き詰めることは出来ない 考察3
残ったのは形1, 5, 7 形5と形7は上下を反転させた形である 形5と形7を敷き詰める通り数は等しい m=iの時の形1を敷き詰める通り数をAiとおく m=iの時の形5, 7を敷き詰める通り数をBiとおく 数列A, Bについて数式を考える 最終的に要求されている答えはAm   考察4
Aiについて考察 m=i-2の形1に右端がくっついている形 m=i-2の形5に右端がくっついている形 m=i-2の形7に右端がくっついている形 以上の3通りが考えられる   考察5
a.m=i-2の形1に右端がくっついている形 この右端を敷き詰めるパターンを列挙すると         の3パターン存在する 従って、a. による敷き詰め方の通り数は (右端の通り数) × (右端以外の場所の通り数) より 3Ai−2となる   考察6
b.m=i-2の形5に右端がくっついている形 この右端を敷き詰めるパターンを列挙すると         の4パターン存在する しかし、一番左以外の敷き詰め方は        ⇒       のように、a. パターンと同じ形 に分けることができてしまう ⇒ a.で既に数えている! 考察7
従って、a. と被らない右端の敷き詰め方は   のみ ⇒ b. による敷き詰め方の通り数はBi−2 c. は b. を上下反転しただけなので、敷き詰め方は同じ ⇒ c. による敷き詰め方の通り数もBi−2 Ai = (a.の通り数) + (b.の通り数) + (c.の通り数)  より Ai=3Ai−2+2Bi−2   考察8
Biについて考察 m=i-2の形1に右端がくっついている形 右端の敷き詰め方は  のみ ⇒ a. による敷き詰め方の通り数はAi−2 m=i-2の形5に右端がくっついている形 右端の敷き詰め方は            の2通り 前者はa. と同じ形に分けることができる ⇒ b. による敷き詰め方の通り数はBi−2   考察9
m=i-2の形7に右端がくっついている形 右端の敷き詰め方は   のみ a. と同じ形に分けることが出来る  ⇒ c. により敷き詰める事はできない 以上より Bi=Ai−2+Bi−2 (ここではBiをm=iの時の形5を敷き詰める通り数として考えたが、形7を敷き詰める通り数として考える場合はc. により敷き詰める通り数がBi−2、b. により敷き詰める通り数が0になる。)   考察10
    を敷き詰める通り数をAm     を敷き詰める通り数をBmと置いたとき Am=033Am−2+2Bm−2     (m is odd)(m=2)       (otherwise) Bm=01Am−2+Bm−2      (m is odd)(m=2)        (otherwise)   B解法
Problem Statement (横, 縦)=(m, 3)の長方形と(n, 2)の長方形を底辺が一直線上にあるように横に並べた形に(1, 2)(2, 1)の長方形を敷き詰める 敷き詰め方のパターン数をkで割った余りを出力 BoundaryCondition 入力されるm,n, kの数は600000個 1≦m≦32767 1≦n≦32767 2≦k≦32767 問C
mが奇数の場合 図形の面積が奇数になるので、敷き詰める通り数 = 0 これ以降はmが偶数だと仮定 敷き詰め方は以下の2パターンに分類出来る 考察1 B A
Aパターン「分けられる」 左の図形を敷き詰める通り数はAm 右の図形を敷き詰める通り数はFn 従ってAパターンを敷き詰める通り数は AmFn Bパターン「分けられない」 分けられない場合は下図の緑に必ず配置される これ以外の「分けられない」配置だと、右側の図形の面積が奇数になる   考察2
Bパターン「分けられない」 左の図形を敷き詰める通り数はBm 右の図形を敷き詰める通り数はFn−1 従ってBパターンを敷き詰める通り数は BmFn−1 これより       を敷き詰める通り数は AmFn+BmFn−1   C解法
n=1の時 AmF1+BmF0 だったので… F0が定義されていない! F0に拡張する F2にも同じ漸化式を適用出来るとすると F2=F1+F0                                          F0=F2−F1=2−1=1   注意1 Fn=1      (n=1)2          (n=2)Fn−1+Fn−2 (otherwise)  
従って 同様に、数列AとBも0に拡張すると 注意2 Fn=1      (n=0)1          (n=1)Fn−1+Fn−2 (otherwise)   Am=013Am−2+2Bm−2     (m is odd)(m=0)       (otherwise)   Bm=00Am−2+Bm−2      (m is odd)(m=0)        (otherwise)  
kの剰余を取る a mod k+b mod k≡a+b   (mod k) a mod kb mod k≡ab      (mod k) 数列の値を求める上で用いる演算について上記の式が成り立つので、オーバーフローしない内にこまめに剰余を取っておく   実装1
数列の値を求める 愚直な実装 n回ループしてFnを、m回ループしてAm, Bmを求める 時間計算量 O(m+n) 600000回繰り返すので 600000(m+n) ≦ 39320400000(393億) m, nが大きくなると計算に時間がかかる   実装2
高速化を考える 最初にF, A, Bの値を一度計算してテーブルを作る そのままの値ではオーバーフローを起こしてしまう kの値がクエリ毎に変わるので剰余を取った値も保存出来ない ⇒ テーブルを作るのは難しい 漸化式を眺めてみる  Am=3Am−2+2Bm−2Bm=Am−2+Bm−2        実装3
漸化式を行列で書き表すことが出来る ところで、Am−2Bm−2=3211Am−4Bm−4 を代入すると AmBm=32112Am−4Bm−4 これをm2回繰り返すと AmBm=3211m2A0B0=3211m210   実装4  Am=3Am−2+2Bm−2Bm=Am−2+Bm−2        ⇒   AmBm=3211Am−2Bm−2  
数列Fについても                          とすることで FnFn−1=1110n10 と行列で表すことが出来る  (F−1=0を用いた) 係数行列の累乗を高速に求めることができれば、数列の値も高速に求めることができるが…   実装5  Fn=Fn−1+Fn−2Fn−1=Fn−1+0Fn−2       
とある行列Dの累乗計算高速化 Dnを高速に求めたい nが2の冪乗の場合 D×D=D2 (掛け算1回) D2×D2=D4 (掛け算2回) D4×D4=D8 (掛け算3回) D8×D8=D16 (掛け算4回)  のようにして、O(lgn)で求まる   実装6
nが2の冪乗ではない場合 nを2進表記してみる  例: n=22 -> (10110)2 nは2の冪乗の和だということが分かる  例: 22=(10110)2=24+22+21 指数部の足し算はそれぞれの掛け算に分解出来る  例: D22=D24+22+21=D24×D22×D21   実装7
指数nのビットが1の所だけ掛け算を行う D16二乗 D8二乗 D4二乗 D2二乗 D1 (22)10 = ( 1          0         1         1         0  )2      D16  ×              D4  ×   D2            = D22 時間計算量 O(lgn)   実装8
行列累乗を用いた全体の時間計算量 600000lgn+lgm=600000lgnm ≦18000000 (1800万) I/Oに時間がかかるが、この方法だとm, nが大きくなっても比較的高速に解を出すことが出来る   実装9
その他の高速化 剰余算の回数を出来るだけ少なくする 除算(剰余算)は加減乗算に比べて圧倒的に時間がかかる 2の除算や剰余算にはビット演算を使う 最適化オプション(-O2)が使われない if分岐をできるだけ少なくする 分岐には時間がかかる 行列の乗算を工夫してみる 実装10
終わり

Weitere ähnliche Inhalte

Was ist angesagt?

公開鍵暗号3: ナップザック暗号
公開鍵暗号3: ナップザック暗号公開鍵暗号3: ナップザック暗号
公開鍵暗号3: ナップザック暗号Joe Suzuki
 
20150922_楕円関数とおもしろい応用
20150922_楕円関数とおもしろい応用20150922_楕円関数とおもしろい応用
20150922_楕円関数とおもしろい応用matsumoring
 
高認数学 第1回 式の計算
高認数学 第1回 式の計算高認数学 第1回 式の計算
高認数学 第1回 式の計算yanai_compass
 
ラビットチャレンジレポート 応用数学
ラビットチャレンジレポート 応用数学ラビットチャレンジレポート 応用数学
ラビットチャレンジレポート 応用数学HiroyukiTerada4
 
ポアンカレ計量
ポアンカレ計量ポアンカレ計量
ポアンカレ計量政孝 鍋島
 
池袋数学勉強会 対馬龍司 線形代数学講義 3章章末問題解説
池袋数学勉強会 対馬龍司 線形代数学講義 3章章末問題解説池袋数学勉強会 対馬龍司 線形代数学講義 3章章末問題解説
池袋数学勉強会 対馬龍司 線形代数学講義 3章章末問題解説GM3D
 
何もないところから数を作る
何もないところから数を作る何もないところから数を作る
何もないところから数を作るTaketo Sano
 
RUPC2014_Day2_J
RUPC2014_Day2_JRUPC2014_Day2_J
RUPC2014_Day2_Js1190048
 
2014年度秋学期 応用数学(解析) 第4部・複素関数論ダイジェスト / 第12回 複素関数・正則関数 (2014. 12. 18)
2014年度秋学期 応用数学(解析) 第4部・複素関数論ダイジェスト / 第12回 複素関数・正則関数 (2014. 12. 18)2014年度秋学期 応用数学(解析) 第4部・複素関数論ダイジェスト / 第12回 複素関数・正則関数 (2014. 12. 18)
2014年度秋学期 応用数学(解析) 第4部・複素関数論ダイジェスト / 第12回 複素関数・正則関数 (2014. 12. 18)Akira Asano
 
VBAで数値計算 07 ベクトル
VBAで数値計算 07 ベクトルVBAで数値計算 07 ベクトル
VBAで数値計算 07 ベクトルKatsuhiro Morishita
 
AtCoder Beginner Contest 025 解説
AtCoder Beginner Contest 025 解説AtCoder Beginner Contest 025 解説
AtCoder Beginner Contest 025 解説AtCoder Inc.
 
複素数・四元数と図形の回転
複素数・四元数と図形の回転複素数・四元数と図形の回転
複素数・四元数と図形の回転Yoshihiro Mizoguchi
 

Was ist angesagt? (15)

公開鍵暗号3: ナップザック暗号
公開鍵暗号3: ナップザック暗号公開鍵暗号3: ナップザック暗号
公開鍵暗号3: ナップザック暗号
 
20150922_楕円関数とおもしろい応用
20150922_楕円関数とおもしろい応用20150922_楕円関数とおもしろい応用
20150922_楕円関数とおもしろい応用
 
高認数学 第1回 式の計算
高認数学 第1回 式の計算高認数学 第1回 式の計算
高認数学 第1回 式の計算
 
ラビットチャレンジレポート 応用数学
ラビットチャレンジレポート 応用数学ラビットチャレンジレポート 応用数学
ラビットチャレンジレポート 応用数学
 
ポアンカレ計量
ポアンカレ計量ポアンカレ計量
ポアンカレ計量
 
池袋数学勉強会 対馬龍司 線形代数学講義 3章章末問題解説
池袋数学勉強会 対馬龍司 線形代数学講義 3章章末問題解説池袋数学勉強会 対馬龍司 線形代数学講義 3章章末問題解説
池袋数学勉強会 対馬龍司 線形代数学講義 3章章末問題解説
 
解説:貢物
解説:貢物解説:貢物
解説:貢物
 
何もないところから数を作る
何もないところから数を作る何もないところから数を作る
何もないところから数を作る
 
平方剰余
平方剰余平方剰余
平方剰余
 
RUPC2014_Day2_J
RUPC2014_Day2_JRUPC2014_Day2_J
RUPC2014_Day2_J
 
2014年度秋学期 応用数学(解析) 第4部・複素関数論ダイジェスト / 第12回 複素関数・正則関数 (2014. 12. 18)
2014年度秋学期 応用数学(解析) 第4部・複素関数論ダイジェスト / 第12回 複素関数・正則関数 (2014. 12. 18)2014年度秋学期 応用数学(解析) 第4部・複素関数論ダイジェスト / 第12回 複素関数・正則関数 (2014. 12. 18)
2014年度秋学期 応用数学(解析) 第4部・複素関数論ダイジェスト / 第12回 複素関数・正則関数 (2014. 12. 18)
 
VBAで数値計算 07 ベクトル
VBAで数値計算 07 ベクトルVBAで数値計算 07 ベクトル
VBAで数値計算 07 ベクトル
 
AtCoder Beginner Contest 025 解説
AtCoder Beginner Contest 025 解説AtCoder Beginner Contest 025 解説
AtCoder Beginner Contest 025 解説
 
Topological sort
Topological sortTopological sort
Topological sort
 
複素数・四元数と図形の回転
複素数・四元数と図形の回転複素数・四元数と図形の回転
複素数・四元数と図形の回転
 

Ähnlich wie SuperCon2010予選アルゴリズム解説

2016年度秋学期 応用数学(解析) 第5回 微分方程式とは,変数分離形 (2016. 10. 27)
2016年度秋学期 応用数学(解析) 第5回 微分方程式とは,変数分離形 (2016. 10. 27)2016年度秋学期 応用数学(解析) 第5回 微分方程式とは,変数分離形 (2016. 10. 27)
2016年度秋学期 応用数学(解析) 第5回 微分方程式とは,変数分離形 (2016. 10. 27)Akira Asano
 
120510サブゼミ数学(2)-1
120510サブゼミ数学(2)-1120510サブゼミ数学(2)-1
120510サブゼミ数学(2)-1takemuralab
 
Haskell で nクィーン問題を解く
Haskell で nクィーン問題を解くHaskell で nクィーン問題を解く
Haskell で nクィーン問題を解くmitstream
 
充足可能性問題のいろいろ
充足可能性問題のいろいろ充足可能性問題のいろいろ
充足可能性問題のいろいろHiroshi Yamashita
 
topology of musical data
topology of musical datatopology of musical data
topology of musical dataTatsuki SHIMIZU
 
2016年度秋学期 応用数学(解析) 第7回 2階線形微分方程式(1) (2016. 11. 17)
2016年度秋学期 応用数学(解析) 第7回 2階線形微分方程式(1) (2016. 11. 17)2016年度秋学期 応用数学(解析) 第7回 2階線形微分方程式(1) (2016. 11. 17)
2016年度秋学期 応用数学(解析) 第7回 2階線形微分方程式(1) (2016. 11. 17)Akira Asano
 
第9回スキル養成講座講義資料
第9回スキル養成講座講義資料第9回スキル養成講座講義資料
第9回スキル養成講座講義資料keiodig
 
【展開用】日曜数学会 Sinc関数の積分について
【展開用】日曜数学会 Sinc関数の積分について【展開用】日曜数学会 Sinc関数の積分について
【展開用】日曜数学会 Sinc関数の積分について和人 桐ケ谷
 
2018年度秋学期 応用数学(解析) 第2部・基本的な微分方程式 第5回 微分方程式とは・変数分離形 (2018. 10. 23)
2018年度秋学期 応用数学(解析) 第2部・基本的な微分方程式 第5回 微分方程式とは・変数分離形 (2018. 10. 23)2018年度秋学期 応用数学(解析) 第2部・基本的な微分方程式 第5回 微分方程式とは・変数分離形 (2018. 10. 23)
2018年度秋学期 応用数学(解析) 第2部・基本的な微分方程式 第5回 微分方程式とは・変数分離形 (2018. 10. 23)Akira Asano
 
ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界Preferred Networks
 
2016年度秋学期 応用数学(解析) 第6回 変数分離形の変形 (2016. 11. 10)
2016年度秋学期 応用数学(解析) 第6回 変数分離形の変形 (2016. 11. 10)2016年度秋学期 応用数学(解析) 第6回 変数分離形の変形 (2016. 11. 10)
2016年度秋学期 応用数学(解析) 第6回 変数分離形の変形 (2016. 11. 10)Akira Asano
 
JOIss2020 発表資料
JOIss2020 発表資料JOIss2020 発表資料
JOIss2020 発表資料mdkcpp 1015
 
2016年度秋学期 応用数学(解析) 第8回 2階線形微分方程式(2) (2016. 11. 24)
2016年度秋学期 応用数学(解析) 第8回 2階線形微分方程式(2) (2016. 11. 24)2016年度秋学期 応用数学(解析) 第8回 2階線形微分方程式(2) (2016. 11. 24)
2016年度秋学期 応用数学(解析) 第8回 2階線形微分方程式(2) (2016. 11. 24)Akira Asano
 
単調増加と階数
単調増加と階数単調増加と階数
単調増加と階数政孝 鍋島
 
単調増加と階乗
単調増加と階乗単調増加と階乗
単調増加と階乗政孝 鍋島
 

Ähnlich wie SuperCon2010予選アルゴリズム解説 (20)

2016年度秋学期 応用数学(解析) 第5回 微分方程式とは,変数分離形 (2016. 10. 27)
2016年度秋学期 応用数学(解析) 第5回 微分方程式とは,変数分離形 (2016. 10. 27)2016年度秋学期 応用数学(解析) 第5回 微分方程式とは,変数分離形 (2016. 10. 27)
2016年度秋学期 応用数学(解析) 第5回 微分方程式とは,変数分離形 (2016. 10. 27)
 
120510サブゼミ数学(2)-1
120510サブゼミ数学(2)-1120510サブゼミ数学(2)-1
120510サブゼミ数学(2)-1
 
Haskell で nクィーン問題を解く
Haskell で nクィーン問題を解くHaskell で nクィーン問題を解く
Haskell で nクィーン問題を解く
 
充足可能性問題のいろいろ
充足可能性問題のいろいろ充足可能性問題のいろいろ
充足可能性問題のいろいろ
 
topology of musical data
topology of musical datatopology of musical data
topology of musical data
 
2016年度秋学期 応用数学(解析) 第7回 2階線形微分方程式(1) (2016. 11. 17)
2016年度秋学期 応用数学(解析) 第7回 2階線形微分方程式(1) (2016. 11. 17)2016年度秋学期 応用数学(解析) 第7回 2階線形微分方程式(1) (2016. 11. 17)
2016年度秋学期 応用数学(解析) 第7回 2階線形微分方程式(1) (2016. 11. 17)
 
第9回スキル養成講座講義資料
第9回スキル養成講座講義資料第9回スキル養成講座講義資料
第9回スキル養成講座講義資料
 
【展開用】日曜数学会 Sinc関数の積分について
【展開用】日曜数学会 Sinc関数の積分について【展開用】日曜数学会 Sinc関数の積分について
【展開用】日曜数学会 Sinc関数の積分について
 
双対性
双対性双対性
双対性
 
2018年度秋学期 応用数学(解析) 第2部・基本的な微分方程式 第5回 微分方程式とは・変数分離形 (2018. 10. 23)
2018年度秋学期 応用数学(解析) 第2部・基本的な微分方程式 第5回 微分方程式とは・変数分離形 (2018. 10. 23)2018年度秋学期 応用数学(解析) 第2部・基本的な微分方程式 第5回 微分方程式とは・変数分離形 (2018. 10. 23)
2018年度秋学期 応用数学(解析) 第2部・基本的な微分方程式 第5回 微分方程式とは・変数分離形 (2018. 10. 23)
 
ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界
 
RUPC2017:M問題
RUPC2017:M問題RUPC2017:M問題
RUPC2017:M問題
 
立命合宿2016Day3:G問題
立命合宿2016Day3:G問題立命合宿2016Day3:G問題
立命合宿2016Day3:G問題
 
2016年度秋学期 応用数学(解析) 第6回 変数分離形の変形 (2016. 11. 10)
2016年度秋学期 応用数学(解析) 第6回 変数分離形の変形 (2016. 11. 10)2016年度秋学期 応用数学(解析) 第6回 変数分離形の変形 (2016. 11. 10)
2016年度秋学期 応用数学(解析) 第6回 変数分離形の変形 (2016. 11. 10)
 
JOIss2020 発表資料
JOIss2020 発表資料JOIss2020 発表資料
JOIss2020 発表資料
 
2016年度秋学期 応用数学(解析) 第8回 2階線形微分方程式(2) (2016. 11. 24)
2016年度秋学期 応用数学(解析) 第8回 2階線形微分方程式(2) (2016. 11. 24)2016年度秋学期 応用数学(解析) 第8回 2階線形微分方程式(2) (2016. 11. 24)
2016年度秋学期 応用数学(解析) 第8回 2階線形微分方程式(2) (2016. 11. 24)
 
abc032
abc032abc032
abc032
 
単調増加と階数
単調増加と階数単調増加と階数
単調増加と階数
 
単調増加と階数
単調増加と階数単調増加と階数
単調増加と階数
 
単調増加と階乗
単調増加と階乗単調増加と階乗
単調増加と階乗
 

SuperCon2010予選アルゴリズム解説