概要
約数の集合の包括関係を考えると,貪欲に答えを決定していくことができます.
問題原案:uni_kakurenbo
解説
操作によって f ( n ) ( n ∈ Z + ) f(n) \scriptsize \;(n \in \Z^+) f ( n ) ( n ∈ Z + ) の値がそれぞれどのように変化するかを考えてみましょう.
f f f の定義から,非負整数 x x x の追加によって f ( n ) ( n ∈ Z + ) f(n) \scriptsize \;(n \in \Z^+) f ( n ) ( n ∈ Z + ) の値が増加するとき,「x x x は n n n の(正の)約数」です.
なお,いかなる操作によっても f ( n ) ( n ∈ Z + ) f(n) \scriptsize \;(n \in \Z^+) f ( n ) ( n ∈ Z + ) の値が減少することはありませんし,ここでは N N N 以下の正整数 n n n に関してのみ f ( n ) f(n) f ( n ) の値に関心があるので,列 X X X に N N N 以上の数を追加することは考えなくてよいことが分かります.N N N 以上の整数を追加したとき f ( n ) f(n) f ( n ) の値が増加するような N N N 以下の正整数 n n n は存在しないからです.
さらに,「x x x は n n n の(正の)約数」であることは「n n n が x x x の(正の)倍数 」であることに等しいですから,この問題を次のように読み替えることもできます:
長さ N N N の列 X ′ = ( X 1 ′ , X 2 ′ , … , X N ′ ) X' = (X'_1, X'_2, \ldots, X'_N) X ′ = ( X 1 ′ , X 2 ′ , … , X N ′ ) があり,はじめ X 1 ′ = X 2 ′ = ⋯ = X N ′ = 0 X'_1 = X'_2 = \cdots = X'_N = 0 X 1 ′ = X 2 ′ = ⋯ = X N ′ = 0 である.
X ′ X' X ′ に対して以下の操作を何度でも行うことができる:
1 ≤ x ≤ N 1 \leq x \leq N 1 ≤ x ≤ N なる整数 x x x を自由に選び,i = k x ( k ∈ Z + ∧ k x ≤ N ) i = kx \scriptsize \; (k \in \Z^+ \land kx \leq N) i = k x ( k ∈ Z + ∧ k x ≤ N ) と表されるようなすべての相異なる i i i について X i ′ X'_i X i ′ に 1 1 1 を加算する.
A = X ′ A = X' A = X ′ とするための操作回数の最小値を求めよ.
この言い換えは必ずしも必要ではないですが,こうすることで少しばかり見通しがよくなるかもしれません.以下では,読み替える前の元の問題を主に扱います.
ここで,操作はどんな順番で行ってもよいので,X X X に追加すべき正整数 x x x の個数を T x T_x T x として,この問題の答えは ∑ 1 ≤ n ≤ N T n \displaystyle \sum_{1 \leq n \leq N} T_n 1 ≤ n ≤ N ∑ T n 回と表されます.
さて,1 1 1 の(正の)約数は 1 1 1 のみですから,f ( 1 ) f(1) f ( 1 ) の値は X X X に含まれる 1 1 1 の個数に一致する,すなわち T 1 = A 1 T_1 = A_1 T 1 = A 1 であることが分かります.
同様に,
2 2 2 の(正の)約数は 1 , 2 1, 2 1 , 2 のみだから,T 1 + T 2 = A 2 T_1 + T_2 = A_2 T 1 + T 2 = A 2 .
3 3 3 の(正の)約数は 1 , 3 1, 3 1 , 3 のみだから,T 1 + T 3 = A 3 T_1 + T_3 = A_3 T 1 + T 3 = A 3 .
4 4 4 の(正の)約数は 1 , 2 , 4 1, 2, 4 1 , 2 , 4 のみだから,T 1 + T 2 + T 4 = A 4 T_1 + T_2 + T_4 = A_4 T 1 + T 2 + T 4 = A 4 .
⋮ \vdots ⋮
∑ m ∣ n m ∈ Z + T m = A n \displaystyle \sum_{\substack{m|n \\m \,\in\, \Z^+}} T_m = A_n m ∣ n m ∈ Z + ∑ T m = A n .
を得ます.
さて,T 1 = A 1 T_1 = A_1 T 1 = A 1 であることが分かっていますから,T 2 = A 2 − T 1 T_2 = A_2 - T_1 T 2 = A 2 − T 1 が分かります.
同様に,
T 3 = A 3 − T 1 T_3 = A_3 - T_1 T 3 = A 3 − T 1 .
T 4 = A 3 − ( T 1 + T 2 ) T_4 = A_3 - (T_1 + T_2) T 4 = A 3 − ( T 1 + T 2 )
⋮ \vdots ⋮
T n = A n − ∑ m ∣ n m < N m ∈ Z + \displaystyle T_n = A_n - \sum_{\substack{m|n \\ m < N \\ m \,\in\, \Z^+}} T n = A n − m ∣ n m < N m ∈ Z + ∑
と,T n ( 1 ≤ n ≤ N ) T_n \scriptsize \; (1 \leq n \leq N) T n ( 1 ≤ n ≤ N ) の値をすべて確定させることができます.
任意の正整数 p p p について,p p p の p p p 以外の正の約数はすべて p p p 未満であることから従います.
このようにして求めた T 1 , T 2 , … , T N T_1, T_2, \ldots, T_N T 1 , T 2 , … , T N の値がすべて非負の整数であるかを調べることで,条件を満たせるかどうかを Θ ( N N ) \Theta(N \sqrt N) Θ ( N N ) 時間などで判定できますが,N ≤ 1 0 6 N \leq 10^6 N ≤ 1 0 6 のもとで実行時間制限に間に合わせることは少々厳しいです.
ここで先ほどの読み替えが役に立つかもしれません.約数よりも倍数の方がプログラムによる列挙が (実装的にも計算量的にも) 簡単なので,より効率よく解くことができるでしょう.
詳しくは実装例も参照してください.
倍数の列挙によって T x T_x T x の値を求めていくと,実装にも依りますが大抵の場合,計算量(のオーダー)は調和級数の発散速度(のオーダー) ( O ( log N ) ) (O(\log N)) ( O ( log N )) の Θ ( N ) \Theta(N) Θ ( N ) 倍と同程度になります.
解説:uni_kakurenbo
実装例