狠狠撸
Submit Search
天下一プログラマーコンテスト2015 予選B 解説
?
0 likes
?
2,080 views
A
AtCoder Inc.
Follow
天下一プログラマーコンテスト2015 予選B 解説
Read less
Read more
1 of 11
Download now
Download to read offline
More Related Content
天下一プログラマーコンテスト2015 予選B 解説
1.
天下一プログラマーコンテスト2015 予選B E問題 解説 2015/8/22
1
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
Download