SlideShare ist ein Scribd-Unternehmen logo
1 von 7
Downloaden Sie, um offline zu lesen
立命合宿 2018 Day3
D: 素因数分解の多様性
●
原案 : 瀧澤
●
問題文 : 瀧澤
●
解答 : 瀧澤・杉江
●
解説 : 杉江
立命合宿 2018 Day3 D: 素因数分解の多様性 解説 2018 / 3 / 28
問題概要
立命合宿 2018 Day3 D: 素因数分解の多様性 解説 2018 / 3 / 28
●
素因数分解マシン
●
自然数を素因数分解し、素因数が小さい順に出力
●
数字以外を表示できないバグがある ( × や累乗は区別できない)
●
例えば 22 = 2 × 11 で、 2048 = 211
だが、どちらも “ 2 11” と表示
●
素因数分解マシンの出力をメモしたが、元の数字がわからない
● 表示された整数の個数は N 個、 i 番目に表示された数字は qi
●
元の自然数としてありえるものはいくつあるか?
●
制約
●
●
2≤qi≤106
1≤N≤105
考察
立命合宿 2018 Day3 D: 素因数分解の多様性 解説 2018 / 3 / 28
●
数字は二連続で素因数の肩に乗らない
●
  みたいな形になることはない!
●
ある数字が素因数の肩に乗る場合・・・
●
その前の数字は必ず素因数として使われる
●
ある数字が素因数の肩に乗らず、素因数として使われる場合・・・
●
その前の数字は素因数として使われている・素因数の肩に乗っている のどちらか
2
35
2 3 5 7
素因数の肩に乗る場合
前の数字は必ず素因数として使う
2 35
7
2 3 5 7
素因数の肩に乗らない場合
ふたつの可能性がある
2 3 5 7 23
5 7
考察
立命合宿 2018 Day3 D: 素因数分解の多様性 解説 2018 / 3 / 28
●
数字が素因数の肩に乗らず、素因数として使われる場合
●
必ずしも ”いつも” 2 通りあるわけではない
●
前の数字が素因数として使われている場合
●
(前の数字)<(今の数字) ならば、この場合があり得る
●
前の数字が素因数として使われていない(素因数の肩)場合
●
( 2 つ前の数字)<(今の数字)ならば、この場合があり得る
●
それぞれ、素数判定を忘れずに!
2 3 5 7
素因数の肩に乗らない場合
2 3 5 7 23
5 7
3 < 5 2 < 5
(前)<(今) (2 つ前)<(今)
想定解法
立命合宿 2018 Day3 D: 素因数分解の多様性 解説 2018 / 3 / 28
●
エラトステネスの篩などで素数判定を O(1) でできるよう前処理
●
動的計画法
●
dp[i][flag] := i 番目の数字まで見て、 i 番目を素因数として
(使わない / 使う)ときの場合の数
●
エラトステネスが一番重く、値の最大値を M とおくとき、
計算量 O(M log log M)
2 3 5 7
素因数として使う場合
2 3 5 7 23
5 7
3 < 5 2 < 5
(前)<(今) (2 つ前)<(今)
2 3 5 7
素因数として使わない場合
前の数字は必ず素因数として使う
2 35
7
想定解法
立命合宿 2018 Day3 D: 素因数分解の多様性 解説 2018 / 3 / 28
●
初期化
●
dp[1][1] → 最初の数が素数なら 1 で、そうでないなら 0
●
遷移
●
dp[i][0] → q[i-1] が素数の場合、 dp[i-1][1] を足す
●
dp[i][1] → q[i] が素数の場合、以下を行う
●
q[i–1] が素数 かつ q[i-1] < q[i] のとき、 dp[i-1][1] を足す
●
q[i-2] が素数 かつ q[i-2] < q[i] のとき、 dp[i-1][0] を足す
2 3 5 7
素因数として使う場合
2 3 5 7 23
5 7
3 < 5 2 < 5
(前)<(今) (2 つ前)<(今)
2 3 5 7
素因数として使わない場合
前の数字は必ず素因数として使う
2 35
7
●
答え
●
dp[N][0] + dp[N][1]
Writer 解 & 統計
●
Writer 解

瀧澤 : 873 bytes, 40 lines (C++)

杉江 : 1153 bytes, 49 lines (C++)
●
Accept / Submission

47.06 % (40 / 85)
●
First Acceptance

On-site : RUPC_ENERGY_STAR (00:16:10)

On-line : ninjaribaton (00:13:06)
立命合宿 2018 Day3 D: 素因数分解の多様性 解説 2018 / 3 / 28

Weitere ähnliche Inhalte

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

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

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: 矢
 
RUPC 2019 Day3 F: 赤黒そーるじぇむ
RUPC 2019 Day3 F: 赤黒そーるじぇむRUPC 2019 Day3 F: 赤黒そーるじぇむ
RUPC 2019 Day3 F: 赤黒そーるじぇむ
 
RUPC 2019 Day3 E: 往復文字列
RUPC 2019 Day3 E: 往復文字列RUPC 2019 Day3 E: 往復文字列
RUPC 2019 Day3 E: 往復文字列
 
RUPC 2019 Day3 C: 約数ゲーム
RUPC 2019 Day3 C: 約数ゲームRUPC 2019 Day3 C: 約数ゲーム
RUPC 2019 Day3 C: 約数ゲーム
 
RUPC 2019 Day3 B: 括弧を語る数
RUPC 2019 Day3 B: 括弧を語る数RUPC 2019 Day3 B: 括弧を語る数
RUPC 2019 Day3 B: 括弧を語る数
 
RUPC 2019 Day3 A: 情報検索
RUPC 2019 Day3 A: 情報検索RUPC 2019 Day3 A: 情報検索
RUPC 2019 Day3 A: 情報検索
 

Kürzlich hochgeladen

Kürzlich hochgeladen (7)

LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 

RUPC 2018 Day3 D: 素因数分解の多様性 (The Diversity of Prime Factorization)

  • 1. 立命合宿 2018 Day3 D: 素因数分解の多様性 ● 原案 : 瀧澤 ● 問題文 : 瀧澤 ● 解答 : 瀧澤・杉江 ● 解説 : 杉江 立命合宿 2018 Day3 D: 素因数分解の多様性 解説 2018 / 3 / 28
  • 2. 問題概要 立命合宿 2018 Day3 D: 素因数分解の多様性 解説 2018 / 3 / 28 ● 素因数分解マシン ● 自然数を素因数分解し、素因数が小さい順に出力 ● 数字以外を表示できないバグがある ( × や累乗は区別できない) ● 例えば 22 = 2 × 11 で、 2048 = 211 だが、どちらも “ 2 11” と表示 ● 素因数分解マシンの出力をメモしたが、元の数字がわからない ● 表示された整数の個数は N 個、 i 番目に表示された数字は qi ● 元の自然数としてありえるものはいくつあるか? ● 制約 ● ● 2≤qi≤106 1≤N≤105
  • 3. 考察 立命合宿 2018 Day3 D: 素因数分解の多様性 解説 2018 / 3 / 28 ● 数字は二連続で素因数の肩に乗らない ●   みたいな形になることはない! ● ある数字が素因数の肩に乗る場合・・・ ● その前の数字は必ず素因数として使われる ● ある数字が素因数の肩に乗らず、素因数として使われる場合・・・ ● その前の数字は素因数として使われている・素因数の肩に乗っている のどちらか 2 35 2 3 5 7 素因数の肩に乗る場合 前の数字は必ず素因数として使う 2 35 7 2 3 5 7 素因数の肩に乗らない場合 ふたつの可能性がある 2 3 5 7 23 5 7
  • 4. 考察 立命合宿 2018 Day3 D: 素因数分解の多様性 解説 2018 / 3 / 28 ● 数字が素因数の肩に乗らず、素因数として使われる場合 ● 必ずしも ”いつも” 2 通りあるわけではない ● 前の数字が素因数として使われている場合 ● (前の数字)<(今の数字) ならば、この場合があり得る ● 前の数字が素因数として使われていない(素因数の肩)場合 ● ( 2 つ前の数字)<(今の数字)ならば、この場合があり得る ● それぞれ、素数判定を忘れずに! 2 3 5 7 素因数の肩に乗らない場合 2 3 5 7 23 5 7 3 < 5 2 < 5 (前)<(今) (2 つ前)<(今)
  • 5. 想定解法 立命合宿 2018 Day3 D: 素因数分解の多様性 解説 2018 / 3 / 28 ● エラトステネスの篩などで素数判定を O(1) でできるよう前処理 ● 動的計画法 ● dp[i][flag] := i 番目の数字まで見て、 i 番目を素因数として (使わない / 使う)ときの場合の数 ● エラトステネスが一番重く、値の最大値を M とおくとき、 計算量 O(M log log M) 2 3 5 7 素因数として使う場合 2 3 5 7 23 5 7 3 < 5 2 < 5 (前)<(今) (2 つ前)<(今) 2 3 5 7 素因数として使わない場合 前の数字は必ず素因数として使う 2 35 7
  • 6. 想定解法 立命合宿 2018 Day3 D: 素因数分解の多様性 解説 2018 / 3 / 28 ● 初期化 ● dp[1][1] → 最初の数が素数なら 1 で、そうでないなら 0 ● 遷移 ● dp[i][0] → q[i-1] が素数の場合、 dp[i-1][1] を足す ● dp[i][1] → q[i] が素数の場合、以下を行う ● q[i–1] が素数 かつ q[i-1] < q[i] のとき、 dp[i-1][1] を足す ● q[i-2] が素数 かつ q[i-2] < q[i] のとき、 dp[i-1][0] を足す 2 3 5 7 素因数として使う場合 2 3 5 7 23 5 7 3 < 5 2 < 5 (前)<(今) (2 つ前)<(今) 2 3 5 7 素因数として使わない場合 前の数字は必ず素因数として使う 2 35 7 ● 答え ● dp[N][0] + dp[N][1]
  • 7. Writer 解 & 統計 ● Writer 解  瀧澤 : 873 bytes, 40 lines (C++)  杉江 : 1153 bytes, 49 lines (C++) ● Accept / Submission  47.06 % (40 / 85) ● First Acceptance  On-site : RUPC_ENERGY_STAR (00:16:10)  On-line : ninjaribaton (00:13:06) 立命合宿 2018 Day3 D: 素因数分解の多様性 解説 2018 / 3 / 28