SlideShare una empresa de Scribd logo
1 de 27
Descargar para leer sin conexión
AtCoder Regular Contest 034
解説
AtCoder株式会社 代表取締役
高橋 直大
2015/2/21 1
競技プログラミングを始める前に
• 競技プログラミングをやったことがない人へ
– まずはこっちのスライドを見よう!
– http://www.slideshare.net/chokudai/abc004
2015/2/21 2
©AtCoder Inc. All rights reserved. 3
A問題 首席
1. 問題概要
2. アルゴリズム
2015/2/21 3
A問題 問題概要
• 受験生の人数Nと、それぞれの受験生の、「国語」
「数学」「理科」「英語」「塗り絵」の5科目の点数が与
えられる。
• 受験生の最終得点は、以下の式で表せられる
– 国語+数学+理科+英語+(塗り絵*110/900)
• 最終得点が最も高い受験生の、最終得点を求めよ
• 制約
– 2 ≦ N ≦ 3049
2015/2/21 4
A問題 アルゴリズム
• 解法
– 順番に点数を計算する
• この時に、(塗り絵)*900/110などを整数演算ではなく、小数とし
て計算出来るように工夫することに注意!
– *900.0にするなど
– 計算した中で、最も点数の高い点数を出力する
• やり方はいろいろ
– 配列に入れてソート
– 最も高い点数を入れる変数を用意しておき、毎回max関数などで最
大値を格納する。
2015/2/21 5
©AtCoder Inc. All rights reserved. 6
B問題 方程式
1. 問題概要
2. アルゴリズム
2015/2/21 6
B問題 問題概要
• Nの十進表記における各桁の数の和をf(n)で表す
• f(x) + x = Nとなるxを全て出力しなさい
• 制約
– 1 ≦ N ≦1018
2015/2/21 7
B問題 アルゴリズム
• 考察
– f(x) + xについて考える
– 全てのxについて、Nについて調べることが可能か?
• 可能であれば、全部試せば良いので簡単!
2015/2/21 8
B問題 アルゴリズム
• 部分点解法 (N≦1000)
– xもf(x)も共に1以上の整数
• つまり、x+f(x)=Nになるには、xはN以下の正整数であることが解
る
– よって、1以上N以下の整数を全て試すことで、部分点を
取ることが出来る
2015/2/21 9
B問題 アルゴリズム 部分点解法(N≦1000)
• 考察
– xもf(x)も共に1以上の整数
• つまり、x+f(x)=Nになるには、xはN以下の正整数であることが解
る
– よって、1以上N以下の整数を全て試すことで、部分点を
取ることが出来る
2015/2/21 10
B問題 アルゴリズム 満点解法
• 考察
– f(x)の最大値はどれくらいか?
• x=99999999999999999の時、f(x) = 9 * 17 = 153
• これよりは大きくならなそう
– つまり、調べるべき範囲は、N-153からNの間で十分
• これは全探索可能!
2015/2/21 11
B問題 アルゴリズム 満点解法
• 注意点
– 数が大きいので、32bit整数型には収まらない
• 64bit整数型などの、大きな数が格納可能な整数型を使おう!
2015/2/21 12
©AtCoder Inc. All rights reserved. 13
C問題 約数かつ倍数
1. 問題概要
2. アルゴリズム
2015/2/21 13
C問題 問題概要
• A,Bが与えられる
• A!の約数であり、B!の倍数である数の個数を出力せ
よ
• 制約
– 1 ≦ B < A ≦ 1018
– A - 100 ≦ B
2015/2/21 14
C問題 アルゴリズム 部分点1
• A,B≦15のとき
– 15! = 1307674368000
• 全通り試すことは出来ない!
• 何か工夫しなければいけない
– Aの約数を全て列挙して、そのうちでBの倍数になってい
るかどうかを1つ1つチェックすれば間に合う?
• 約数を、O(√A!)くらいで列挙出来れば可能!
2015/2/21 15
C問題 アルゴリズム 部分点1
• 簡単な約数の列挙方法
– 例えば、A=5の時、A! = 120(これを暫定的にFAとする)
– これの約数を列挙することを考える
• 1から√FA (11くらい)までのうち、FAの約数であるものをループで探
す
– If(FA % I == 0)みたいな感じ
• 見つかった約数をiとすると、FA/iもFAの約数である
– 1が約数なので、120も約数
– 2が約数なので、60も約数
– 3が約数なので、40も約数
– ・・・・
• これを、√FAまで繰り返すことによって、全ての約数を列挙でき
る!
• 各約数に対して、B!の倍数になっているかどうかチェックすれば
良い
2015/2/21 16
C問題 アルゴリズム 部分点2
• 考察
– もっと高速化するには、根本的な部分を見直す必要があ
る。
– A!の倍数かつ、B!の約数とは何か?
• (A! / B!)の約数に、B!を掛けたものである!
• 例えば、A=5, B=3であれば、5*4の約数に、3*2*1を掛けたもので
ある!
– 20の約数は1,2,4,5,10,20なので、解は6,12,24,30,60,120である
• まずはこれを利用する
2015/2/21 17
C問題 アルゴリズム 部分点2
• さらに考察
– A,Bが大きい時、全ての約数を列挙するのは難しい
• 約数の個数をもっと上手に数えよう!
– 約数を効率的に数えるには、素因数分解をすると良い!
– 例えば、20の約数の個数を数えたい時、
• 20 = 2 × 2 × 5と表せる。
• この約数は、(2の0,1,2乗のいずれか) × (5の0,1乗のいずれか)
であることが解る
– 例えば、2の1乗×5の1乗を選ぶと、約数の1つである10が出来る
• つまり、この組み合わせの個数を数えてあげれば良い!
– これは、各素因数に対して、その指数が分かれば良い
2015/2/21 18
C問題 アルゴリズム 部分点2
• A,B≦10^6, A-B≦100の時
– A! / B!について、約数の個数を調べたい
– 計算式を考えて、10^6以上の素因数は、この数には含ま
れない
• よって、各素因数について、いくつ存在したかを配列で管理して
あげれば良い
– A!/B!を素因数分解するのは難しいが、B+1からAまでの整
数1つ1つに対して、素因数分解してあげるのは可能
• であれば、この1つ1つに対して素因数分解を行い、指数の計算を
してあげれば良い。1つ1つの計算量は、部分点1の約数全列挙と
同じようなアルゴリズムを用いると、O(√A)
– 指数が求まったら、あとは先ほどの公式を用いて、約数
の個数を計算すれば解ける
2015/2/21 19
C問題 アルゴリズム 満点解法
• A,B≦10^9, A-B≦100の時
– 先ほどのように、素因数の最大値が小さくはならない
• だが、種類数自体はそこまで多くない!
• よって、配列で管理していた部分を、連想配列に直してあげれば
良い!
– 計算量は、素因数分解がO(√A)、その回数が100回で、1
回の素因数分解で発生する素因数は、O(logA)個程度な
ので、十分に間に合う
2015/2/21 20
2015-2-21
AtCoder Regular Contest 034
問題D 解説 (暫定版)
AtCoder株式会社 代表取締役
高橋 直大
1
2015-2-21 ©AtCoder Inc. All rights reserved. *
D問題
1. 問題概要
2. 解法
2
2015-2-21
D問題 問題概要
•赤 数字 整数 書 A枚
•青 数字 整数 書 B枚
•何 書 C枚
•以上 山札 上 引 行
•赤 数字a 引 +a点
•青 数字b 引 得点 b倍
•何 引
•最終得点 期待値 ?
•制約
– 1 A,B,C 50
– 1 各数字 100
3
D問題 部分点解法1 (5点)
出題者 都合 超 駆 足
申 訳 by evima
•1 A,B,C 3
•合計9枚以下
•山札 全 試
•時間計算量 O((A+B+C)! * poly(A+B))
D問題 部分点解法2 (20点)
•1 A,B,C 8
•赤 青 合計16枚以下
•dp[今 引 集合]
•時間計算量 O(2^(A+B) * poly(A+B))
D問題 部分点解法3 (40点)
•1 A, C 50, 1 B 8
• 考 赤 書 数字 平均
R 全 赤 R 書 答
同 → 区別不要
•dp[引 赤 枚数][引 青 集
合]
•時間計算量 O(2^B * poly(A+B))
D問題 満点解法
•1 A, B, C 50
• 考 青 区別不要
•青 i枚引 積 期待値
B[i] 値 計算 使
•dp[引 赤 枚数][引 青 枚
数]
•時間計算量 O(poly(A+B))

Más contenido relacionado

La actualidad más candente

AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説AtCoder Inc.
 
AtCoder Regular Contest 027 解説
AtCoder Regular Contest 027 解説AtCoder Regular Contest 027 解説
AtCoder Regular Contest 027 解説AtCoder Inc.
 
AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Inc.
 
AtCoder Beginner Contest 005 解説
AtCoder Beginner Contest 005 解説AtCoder Beginner Contest 005 解説
AtCoder Beginner Contest 005 解説AtCoder Inc.
 
AtCoder Beginner Contest 016 解説
AtCoder Beginner Contest 016 解説AtCoder Beginner Contest 016 解説
AtCoder Beginner Contest 016 解説AtCoder Inc.
 
AtCoder Regular Contest 033 解説
AtCoder Regular Contest 033 解説AtCoder Regular Contest 033 解説
AtCoder Regular Contest 033 解説AtCoder Inc.
 
AtCoder Beginner Contest 025 解説
AtCoder Beginner Contest 025 解説AtCoder Beginner Contest 025 解説
AtCoder Beginner Contest 025 解説AtCoder Inc.
 
AtCoder Beginner Contest 002 解説
AtCoder Beginner Contest 002 解説AtCoder Beginner Contest 002 解説
AtCoder Beginner Contest 002 解説AtCoder Inc.
 
AtCoder Beginner Contest 024 解説
AtCoder Beginner Contest 024 解説AtCoder Beginner Contest 024 解説
AtCoder Beginner Contest 024 解説AtCoder Inc.
 
CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説AtCoder Inc.
 
AtCoder Beginner Contest 014 解説
AtCoder Beginner Contest 014 解説AtCoder Beginner Contest 014 解説
AtCoder Beginner Contest 014 解説AtCoder Inc.
 
AtCoder Regular Contest 031 解説
AtCoder Regular Contest 031 解説AtCoder Regular Contest 031 解説
AtCoder Regular Contest 031 解説AtCoder Inc.
 
AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説AtCoder Inc.
 
AtCoder Beginner Contest 010 解説
AtCoder Beginner Contest 010 解説AtCoder Beginner Contest 010 解説
AtCoder Beginner Contest 010 解説AtCoder Inc.
 
AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Inc.
 
AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説AtCoder Inc.
 
AtCoder Regular Contest 021 解説
AtCoder Regular Contest 021 解説AtCoder Regular Contest 021 解説
AtCoder Regular Contest 021 解説AtCoder Inc.
 
AtCoder Beginner Contest 003 解説
AtCoder Beginner Contest 003 解説AtCoder Beginner Contest 003 解説
AtCoder Beginner Contest 003 解説AtCoder Inc.
 

La actualidad más candente (20)

AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説
 
AtCoder Regular Contest 027 解説
AtCoder Regular Contest 027 解説AtCoder Regular Contest 027 解説
AtCoder Regular Contest 027 解説
 
AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説
 
AtCoder Beginner Contest 005 解説
AtCoder Beginner Contest 005 解説AtCoder Beginner Contest 005 解説
AtCoder Beginner Contest 005 解説
 
AtCoder Beginner Contest 016 解説
AtCoder Beginner Contest 016 解説AtCoder Beginner Contest 016 解説
AtCoder Beginner Contest 016 解説
 
abc032
abc032abc032
abc032
 
AtCoder Regular Contest 033 解説
AtCoder Regular Contest 033 解説AtCoder Regular Contest 033 解説
AtCoder Regular Contest 033 解説
 
AtCoder Beginner Contest 025 解説
AtCoder Beginner Contest 025 解説AtCoder Beginner Contest 025 解説
AtCoder Beginner Contest 025 解説
 
AtCoder Beginner Contest 002 解説
AtCoder Beginner Contest 002 解説AtCoder Beginner Contest 002 解説
AtCoder Beginner Contest 002 解説
 
AtCoder Beginner Contest 024 解説
AtCoder Beginner Contest 024 解説AtCoder Beginner Contest 024 解説
AtCoder Beginner Contest 024 解説
 
CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説
 
abc031
abc031abc031
abc031
 
AtCoder Beginner Contest 014 解説
AtCoder Beginner Contest 014 解説AtCoder Beginner Contest 014 解説
AtCoder Beginner Contest 014 解説
 
AtCoder Regular Contest 031 解説
AtCoder Regular Contest 031 解説AtCoder Regular Contest 031 解説
AtCoder Regular Contest 031 解説
 
AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説
 
AtCoder Beginner Contest 010 解説
AtCoder Beginner Contest 010 解説AtCoder Beginner Contest 010 解説
AtCoder Beginner Contest 010 解説
 
AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説
 
AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説
 
AtCoder Regular Contest 021 解説
AtCoder Regular Contest 021 解説AtCoder Regular Contest 021 解説
AtCoder Regular Contest 021 解説
 
AtCoder Beginner Contest 003 解説
AtCoder Beginner Contest 003 解説AtCoder Beginner Contest 003 解説
AtCoder Beginner Contest 003 解説
 

Similar a AtCoder Regular Contest 034 解説

Similar a AtCoder Regular Contest 034 解説 (6)

Aizu-2017: B
Aizu-2017: BAizu-2017: B
Aizu-2017: B
 
Indeedなう 予選A 解説
Indeedなう 予選A 解説Indeedなう 予選A 解説
Indeedなう 予選A 解説
 
AtCoder Beginner Contest 020 解説
AtCoder Beginner Contest 020 解説AtCoder Beginner Contest 020 解説
AtCoder Beginner Contest 020 解説
 
AtCoder Beginner Contest 019 解説
AtCoder Beginner Contest 019 解説AtCoder Beginner Contest 019 解説
AtCoder Beginner Contest 019 解説
 
AtCoder Beginner Contest 011 解説
AtCoder Beginner Contest 011 解説AtCoder Beginner Contest 011 解説
AtCoder Beginner Contest 011 解説
 
CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説
 

Más 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.
 
AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説AtCoder Inc.
 
DDPC 2016 予選 解説
DDPC 2016 予選 解説DDPC 2016 予選 解説
DDPC 2016 予選 解説AtCoder Inc.
 
AtCoder Regular Contest 046
AtCoder Regular Contest 046AtCoder Regular Contest 046
AtCoder Regular Contest 046AtCoder 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.
 
AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説AtCoder Inc.
 
CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説AtCoder Inc.
 
AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説AtCoder Inc.
 
AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説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.
 

Más de AtCoder Inc. (20)

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 解説
 
AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説
 
DDPC 2016 予選 解説
DDPC 2016 予選 解説DDPC 2016 予選 解説
DDPC 2016 予選 解説
 
arc047
arc047arc047
arc047
 
AtCoder Regular Contest 046
AtCoder Regular Contest 046AtCoder Regular Contest 046
AtCoder Regular Contest 046
 
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 解説
 
AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説
 
CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説
 
AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説
 
AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説
 
天下一プログラマーコンテスト2015 予選B 解説
天下一プログラマーコンテスト2015 予選B 解説天下一プログラマーコンテスト2015 予選B 解説
天下一プログラマーコンテスト2015 予選B 解説
 
AtCoder Regular Contest 043 解説
AtCoder Regular Contest 043 解説AtCoder Regular Contest 043 解説
AtCoder Regular Contest 043 解説
 

AtCoder Regular Contest 034 解説

  • 1. AtCoder Regular Contest 034 解説 AtCoder株式会社 代表取締役 高橋 直大 2015/2/21 1
  • 3. ©AtCoder Inc. All rights reserved. 3 A問題 首席 1. 問題概要 2. アルゴリズム 2015/2/21 3
  • 4. A問題 問題概要 • 受験生の人数Nと、それぞれの受験生の、「国語」 「数学」「理科」「英語」「塗り絵」の5科目の点数が与 えられる。 • 受験生の最終得点は、以下の式で表せられる – 国語+数学+理科+英語+(塗り絵*110/900) • 最終得点が最も高い受験生の、最終得点を求めよ • 制約 – 2 ≦ N ≦ 3049 2015/2/21 4
  • 5. A問題 アルゴリズム • 解法 – 順番に点数を計算する • この時に、(塗り絵)*900/110などを整数演算ではなく、小数とし て計算出来るように工夫することに注意! – *900.0にするなど – 計算した中で、最も点数の高い点数を出力する • やり方はいろいろ – 配列に入れてソート – 最も高い点数を入れる変数を用意しておき、毎回max関数などで最 大値を格納する。 2015/2/21 5
  • 6. ©AtCoder Inc. All rights reserved. 6 B問題 方程式 1. 問題概要 2. アルゴリズム 2015/2/21 6
  • 7. B問題 問題概要 • Nの十進表記における各桁の数の和をf(n)で表す • f(x) + x = Nとなるxを全て出力しなさい • 制約 – 1 ≦ N ≦1018 2015/2/21 7
  • 8. B問題 アルゴリズム • 考察 – f(x) + xについて考える – 全てのxについて、Nについて調べることが可能か? • 可能であれば、全部試せば良いので簡単! 2015/2/21 8
  • 9. B問題 アルゴリズム • 部分点解法 (N≦1000) – xもf(x)も共に1以上の整数 • つまり、x+f(x)=Nになるには、xはN以下の正整数であることが解 る – よって、1以上N以下の整数を全て試すことで、部分点を 取ることが出来る 2015/2/21 9
  • 10. B問題 アルゴリズム 部分点解法(N≦1000) • 考察 – xもf(x)も共に1以上の整数 • つまり、x+f(x)=Nになるには、xはN以下の正整数であることが解 る – よって、1以上N以下の整数を全て試すことで、部分点を 取ることが出来る 2015/2/21 10
  • 11. B問題 アルゴリズム 満点解法 • 考察 – f(x)の最大値はどれくらいか? • x=99999999999999999の時、f(x) = 9 * 17 = 153 • これよりは大きくならなそう – つまり、調べるべき範囲は、N-153からNの間で十分 • これは全探索可能! 2015/2/21 11
  • 12. B問題 アルゴリズム 満点解法 • 注意点 – 数が大きいので、32bit整数型には収まらない • 64bit整数型などの、大きな数が格納可能な整数型を使おう! 2015/2/21 12
  • 13. ©AtCoder Inc. All rights reserved. 13 C問題 約数かつ倍数 1. 問題概要 2. アルゴリズム 2015/2/21 13
  • 14. C問題 問題概要 • A,Bが与えられる • A!の約数であり、B!の倍数である数の個数を出力せ よ • 制約 – 1 ≦ B < A ≦ 1018 – A - 100 ≦ B 2015/2/21 14
  • 15. C問題 アルゴリズム 部分点1 • A,B≦15のとき – 15! = 1307674368000 • 全通り試すことは出来ない! • 何か工夫しなければいけない – Aの約数を全て列挙して、そのうちでBの倍数になってい るかどうかを1つ1つチェックすれば間に合う? • 約数を、O(√A!)くらいで列挙出来れば可能! 2015/2/21 15
  • 16. C問題 アルゴリズム 部分点1 • 簡単な約数の列挙方法 – 例えば、A=5の時、A! = 120(これを暫定的にFAとする) – これの約数を列挙することを考える • 1から√FA (11くらい)までのうち、FAの約数であるものをループで探 す – If(FA % I == 0)みたいな感じ • 見つかった約数をiとすると、FA/iもFAの約数である – 1が約数なので、120も約数 – 2が約数なので、60も約数 – 3が約数なので、40も約数 – ・・・・ • これを、√FAまで繰り返すことによって、全ての約数を列挙でき る! • 各約数に対して、B!の倍数になっているかどうかチェックすれば 良い 2015/2/21 16
  • 17. C問題 アルゴリズム 部分点2 • 考察 – もっと高速化するには、根本的な部分を見直す必要があ る。 – A!の倍数かつ、B!の約数とは何か? • (A! / B!)の約数に、B!を掛けたものである! • 例えば、A=5, B=3であれば、5*4の約数に、3*2*1を掛けたもので ある! – 20の約数は1,2,4,5,10,20なので、解は6,12,24,30,60,120である • まずはこれを利用する 2015/2/21 17
  • 18. C問題 アルゴリズム 部分点2 • さらに考察 – A,Bが大きい時、全ての約数を列挙するのは難しい • 約数の個数をもっと上手に数えよう! – 約数を効率的に数えるには、素因数分解をすると良い! – 例えば、20の約数の個数を数えたい時、 • 20 = 2 × 2 × 5と表せる。 • この約数は、(2の0,1,2乗のいずれか) × (5の0,1乗のいずれか) であることが解る – 例えば、2の1乗×5の1乗を選ぶと、約数の1つである10が出来る • つまり、この組み合わせの個数を数えてあげれば良い! – これは、各素因数に対して、その指数が分かれば良い 2015/2/21 18
  • 19. C問題 アルゴリズム 部分点2 • A,B≦10^6, A-B≦100の時 – A! / B!について、約数の個数を調べたい – 計算式を考えて、10^6以上の素因数は、この数には含ま れない • よって、各素因数について、いくつ存在したかを配列で管理して あげれば良い – A!/B!を素因数分解するのは難しいが、B+1からAまでの整 数1つ1つに対して、素因数分解してあげるのは可能 • であれば、この1つ1つに対して素因数分解を行い、指数の計算を してあげれば良い。1つ1つの計算量は、部分点1の約数全列挙と 同じようなアルゴリズムを用いると、O(√A) – 指数が求まったら、あとは先ほどの公式を用いて、約数 の個数を計算すれば解ける 2015/2/21 19
  • 20. C問題 アルゴリズム 満点解法 • A,B≦10^9, A-B≦100の時 – 先ほどのように、素因数の最大値が小さくはならない • だが、種類数自体はそこまで多くない! • よって、配列で管理していた部分を、連想配列に直してあげれば 良い! – 計算量は、素因数分解がO(√A)、その回数が100回で、1 回の素因数分解で発生する素因数は、O(logA)個程度な ので、十分に間に合う 2015/2/21 20
  • 21. 2015-2-21 AtCoder Regular Contest 034 問題D 解説 (暫定版) AtCoder株式会社 代表取締役 高橋 直大 1
  • 22. 2015-2-21 ©AtCoder Inc. All rights reserved. * D問題 1. 問題概要 2. 解法 2
  • 23. 2015-2-21 D問題 問題概要 •赤 数字 整数 書 A枚 •青 数字 整数 書 B枚 •何 書 C枚 •以上 山札 上 引 行 •赤 数字a 引 +a点 •青 数字b 引 得点 b倍 •何 引 •最終得点 期待値 ? •制約 – 1 A,B,C 50 – 1 各数字 100 3
  • 24. D問題 部分点解法1 (5点) 出題者 都合 超 駆 足 申 訳 by evima •1 A,B,C 3 •合計9枚以下 •山札 全 試 •時間計算量 O((A+B+C)! * poly(A+B))
  • 25. D問題 部分点解法2 (20点) •1 A,B,C 8 •赤 青 合計16枚以下 •dp[今 引 集合] •時間計算量 O(2^(A+B) * poly(A+B))
  • 26. D問題 部分点解法3 (40点) •1 A, C 50, 1 B 8 • 考 赤 書 数字 平均 R 全 赤 R 書 答 同 → 区別不要 •dp[引 赤 枚数][引 青 集 合] •時間計算量 O(2^B * poly(A+B))
  • 27. D問題 満点解法 •1 A, B, C 50 • 考 青 区別不要 •青 i枚引 積 期待値 B[i] 値 計算 使 •dp[引 赤 枚数][引 青 枚 数] •時間計算量 O(poly(A+B))