SlideShare a Scribd company logo
1 of 11
Download to read offline
天下一プログラマーコンテスト2015
予選B E問題 解説
2015/8/22 1
©AtCoder Inc. All rights reserved. 2
E問題 天下一演算
1. 問題概要
2. アルゴリズム
2015/8/22 2
E問題 問題概要
• N個の整数が与えられる
• すべての整数に10を掛ける操作を何回か行う
• それぞれの整数に1を足す操作を何回か行う
• すべての整数をMの倍数にするのに必要な最小の
操作の回数を求めよ
• 制約
1 ≦ N ≦ 105, 1 ≦ M ≦ 105
2015/8/22 3
E問題 アルゴリズム
• 整数xにi回10を掛けた後、何回1を足せばMの倍数
になるかをFi(x)と表すことにする
• N=1の場合を考える
– M = 7, A = [1]の場合
– F0(1)=6, F1(1)=4, F2(1)=5, F3(1)=1, F4(1)=3, F5(1)=2, F6(1)=6
– Fi+1(x) = Fi(x)×10 % M
– 周期性?
2015/8/22 4
E問題 アルゴリズム
• iが小さいところで周期的にならない例
– M = 12, A = [1]の場合
– F0(1)=11, F1(1)=2, F2(1)=8, F3(1)=8, …
• どの程度で周期に入るか?
– gcd(a×10i, M) = gcd(a×10i+1, M)なら、それ以降は周期的
に変化する
– O(log M)
– この問題の制約では16回10を掛ければ良い
– 最初に周期に入るまで愚直に計算しておく
2015/8/22 5
E問題 アルゴリズム
• 周期の長さ
– 周期の長さはφ(M)を割り切る
– φ:オイラーのφ関数
– 1~Nの整数でNと互いに素なものの個数をφ(N)と書く
• Mと10が互いに素の場合
– オイラーの定理より、10φ(M) ≡ 1 (mod M)
– したがってAi×10φ(M) ≡ Ai (mod M)
2015/8/22 6
E問題 アルゴリズム
• Mと10が互いに素でない場合
– gcd(a×10i, M) = gcd(a×10i+1, M)となる最小のiをK、このと
きのgcdをGとすると、10φ(M/G) ≡ 1 (mod M/G)
– 両辺に10K/Gを掛けて整理すると10K+φ(M/G) ≡ 10K (mod M)
– GとM/Gは互いに素なのでφ(G)φ(M/G) = φ(M)
– したがって10K+φ(M) ≡ 10K(10φ(M/G))φ(G) ≡ 10K (mod M)
– よってAi×10K+φ(M) ≡ Ai ×10K (mod M)
• 以下ではAi×10φ(M) ≡ Ai (mod M)となるとして考える
– 最初に16回以上10を掛ければ良い
– Ai×10Kを新たなAiと見なす
2015/8/22 7
E問題 アルゴリズム
• N≧1の場合を考える
– 周期ごとに分けると高速に計算できる
– 周期の長さをLとして、X’i,j = Fi(10j×α)と、各10j×αに対応
するAの要素の数Yjを考える
– Si = Σj X’i,jYj (i,j:0~L-1)を求めたい
– ここでXj = X’0,jとして、X’i+1,j = X’i,j+1であることを利用すると、
Si = Σj Xj+iYjと書ける
– これは多項式乗算に帰着されて、FFT (O(L log L))や、
Karatsuba法 (O(Llog23)≒O(L1.585))で解ける
2015/8/22 8
E問題 アルゴリズム
• 入力例1
– X = {6,4,5,1,3,2}, Y = {1,1,1,0,0,0}
– f(x) = 6+4x+5x2+x3+3x4+2x5, g(x) = x5+x4+x3 とする
– f(x)g(x) = 6x3+10x4+15x5+10x6+9x7+6x8+5x9+2x10
– f(x)g(x)のxiの項の係数をh(i)とすると Si = h(i-1)+h(i+L-1)に
なっている
2015/8/22 9
E問題 アルゴリズム
• 全ての周期を足し合わせる
– 周期の長さごとに足しておく
– それぞれをφ(M)まで足し合わせる
– 計算量はO(M√M)だが実際には十分高速で、多項式乗算
がボトルネックとなる
• これで10を掛ける回数を決めたときに、何回1を足
す必要があるか分かるようになった
– 10を掛ける回数はφ(M) + log M以下でよい
2015/8/22 10
E問題 アルゴリズム
• まとめ
– 周期に入るまで愚直に10を掛ける O(N log M)
– 多項式乗算に帰着させてFFTやKaratsuba法で計算する
O(M log M) or O(Mlog23)
– 全ての周期を足し合わせる O(M√M)
– 10を掛けた回数ごとに何回1を足すか調べる O(M)
2015/8/22 11

More Related Content

More from 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 Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder 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.
 
CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説AtCoder 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 Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説AtCoder Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説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 Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説AtCoder Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説AtCoder Inc.
 
AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説AtCoder Inc.
 

More from 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 Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説
 
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 解説
 
arc047
arc047arc047
arc047
 
abc032
abc032abc032
abc032
 
CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説
 
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 Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説AtCoder Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説
 
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 Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説AtCoder Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説
 
AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説
 

天下一プログラマーコンテスト2015 予選B 解説

  • 2. ©AtCoder Inc. All rights reserved. 2 E問題 天下一演算 1. 問題概要 2. アルゴリズム 2015/8/22 2
  • 3. E問題 問題概要 • N個の整数が与えられる • すべての整数に10を掛ける操作を何回か行う • それぞれの整数に1を足す操作を何回か行う • すべての整数をMの倍数にするのに必要な最小の 操作の回数を求めよ • 制約 1 ≦ N ≦ 105, 1 ≦ M ≦ 105 2015/8/22 3
  • 4. E問題 アルゴリズム • 整数xにi回10を掛けた後、何回1を足せばMの倍数 になるかをFi(x)と表すことにする • N=1の場合を考える – M = 7, A = [1]の場合 – F0(1)=6, F1(1)=4, F2(1)=5, F3(1)=1, F4(1)=3, F5(1)=2, F6(1)=6 – Fi+1(x) = Fi(x)×10 % M – 周期性? 2015/8/22 4
  • 5. E問題 アルゴリズム • iが小さいところで周期的にならない例 – M = 12, A = [1]の場合 – F0(1)=11, F1(1)=2, F2(1)=8, F3(1)=8, … • どの程度で周期に入るか? – gcd(a×10i, M) = gcd(a×10i+1, M)なら、それ以降は周期的 に変化する – O(log M) – この問題の制約では16回10を掛ければ良い – 最初に周期に入るまで愚直に計算しておく 2015/8/22 5
  • 6. E問題 アルゴリズム • 周期の長さ – 周期の長さはφ(M)を割り切る – φ:オイラーのφ関数 – 1~Nの整数でNと互いに素なものの個数をφ(N)と書く • Mと10が互いに素の場合 – オイラーの定理より、10φ(M) ≡ 1 (mod M) – したがってAi×10φ(M) ≡ Ai (mod M) 2015/8/22 6
  • 7. E問題 アルゴリズム • Mと10が互いに素でない場合 – gcd(a×10i, M) = gcd(a×10i+1, M)となる最小のiをK、このと きのgcdをGとすると、10φ(M/G) ≡ 1 (mod M/G) – 両辺に10K/Gを掛けて整理すると10K+φ(M/G) ≡ 10K (mod M) – GとM/Gは互いに素なのでφ(G)φ(M/G) = φ(M) – したがって10K+φ(M) ≡ 10K(10φ(M/G))φ(G) ≡ 10K (mod M) – よってAi×10K+φ(M) ≡ Ai ×10K (mod M) • 以下ではAi×10φ(M) ≡ Ai (mod M)となるとして考える – 最初に16回以上10を掛ければ良い – Ai×10Kを新たなAiと見なす 2015/8/22 7
  • 8. E問題 アルゴリズム • N≧1の場合を考える – 周期ごとに分けると高速に計算できる – 周期の長さをLとして、X’i,j = Fi(10j×α)と、各10j×αに対応 するAの要素の数Yjを考える – Si = Σj X’i,jYj (i,j:0~L-1)を求めたい – ここでXj = X’0,jとして、X’i+1,j = X’i,j+1であることを利用すると、 Si = Σj Xj+iYjと書ける – これは多項式乗算に帰着されて、FFT (O(L log L))や、 Karatsuba法 (O(Llog23)≒O(L1.585))で解ける 2015/8/22 8
  • 9. E問題 アルゴリズム • 入力例1 – X = {6,4,5,1,3,2}, Y = {1,1,1,0,0,0} – f(x) = 6+4x+5x2+x3+3x4+2x5, g(x) = x5+x4+x3 とする – f(x)g(x) = 6x3+10x4+15x5+10x6+9x7+6x8+5x9+2x10 – f(x)g(x)のxiの項の係数をh(i)とすると Si = h(i-1)+h(i+L-1)に なっている 2015/8/22 9
  • 10. E問題 アルゴリズム • 全ての周期を足し合わせる – 周期の長さごとに足しておく – それぞれをφ(M)まで足し合わせる – 計算量はO(M√M)だが実際には十分高速で、多項式乗算 がボトルネックとなる • これで10を掛ける回数を決めたときに、何回1を足 す必要があるか分かるようになった – 10を掛ける回数はφ(M) + log M以下でよい 2015/8/22 10
  • 11. E問題 アルゴリズム • まとめ – 周期に入るまで愚直に10を掛ける O(N log M) – 多項式乗算に帰着させてFFTやKaratsuba法で計算する O(M log M) or O(Mlog23) – 全ての周期を足し合わせる O(M√M) – 10を掛けた回数ごとに何回1を足すか調べる O(M) 2015/8/22 11