この問題では、十六進表記された数における倍数判定を考える必要があります。

十六進表記された整数 XX において、以下のことが成り立ちます。

  • XX の下 11 桁が 22 で割り切れるなら、XX22 で割り切れる。(①)
  • XX の各桁の和が 55 で割り切れるなら、XX55 で割り切れる。(②)

これら 22 つを同時に満たすとき、 XX1010 で割り切れます。

以下は①、②の証明です。
XXMM 桁として、上からii桁目の数字(文字)を XiX_iとして説明します。
XX は以下のように表せます。

XX == 16M1X116^{M-1}X_1 ++ 16M2X216^{M-2}X_2 ++ ... ++ 162XM216^2X_{M-2} ++ 16XM116X_{M-1} ++ XMX_{M}

<①について>

XX を下一桁とそれ以外で分けて考えます。

XX == 1616 (16M2X1(16^{M-2}X_1 ++ 16M3X216^{M-3}X_2 ++ ... ++ 16XM216X_{M-2} ++ XM1)X_{M-1}) ++ XMX_{M}

すると、XX22 で割り切れることと XMX_M22 で割り切れることは同値であることが分かります。

<②について>

XX を以下のように、各桁の和とそれ以外に分けて考えます。

XX == (16M11)X1(16^{M-1} - 1)X_1 ++ (16M21)X2(16^{M-2}-1)X_2 ++ ... ++ (1621)XM2(16^2-1)X_{M-2} ++ (161)XM1(16-1)X_{M-1} ++ (X1+X2+...+XM2+XM1+XM)(X_1+X_2+...+X_{M-2}+X_{M-1}+X_{M})

(X1+X2+...+XM2+XM1+XM)(X_1+X_2+...+X_{M-2}+X_{M-1}+X_{M}) は各桁の和を表しています。

ここで、16i116^i-1 (1i)(1 \leq i)55 で割り切れるため、上の式の左側はすべて 55 で割り切れます。

すると、XX55 で割り切れることと (X1+X2+...+XM2+XM1+XM)(X_1+X_2+...+X_{M-2}+X_{M-1}+X_{M})55 で割り切れることは同値であることが分かります。

これは 十進表記における、33 の倍数の各桁の和が 33 の倍数であることに似ています。

解答例(C++)

<追加問題>

十六進表記された整数 XX1717 の倍数であるかどうかを判定してください。