問題概略
次のような動作をする機械があります。
「キーボードから数 を入力すると を計算し,それまでの合計に加算する」
この機械に 1 から 1000 までの整数を小さい順に入力していき,1 回ごとに表示される数値を確認していきます。
次のように表示されますね。
- 1 回目は
- 2 回目は
- 3 回目は
表示される数値の 1 の位が 5 になることは 1000 回のうち何回あるでしょうか。
http://www.sansu.org/used-html/index1127.html
解説の pdf も作りました。きれいなレイアウトで読みたい方はこちらをどうぞ。
割ってから足す
平方数を 10 で割った余りは周期 10 で,その値は 1, 4, 9, 6, 5, 6, 9, 4, 1, 0 です。
これらの和は 45 で,2 倍した 90 は 10 の倍数。
回目に表示される数を とおいて, を 10 で割った余りを とおくと,これは 20 を周期にもちます。
数式で書くとなにやら仰々しいのですが,「全部足してから 10 で割る」のと「10 で割った余りを足して,最後にもう一回 10 で割る」のは同じです。
の関係式を求めましょう。 から
\begin{align*}
g(n+1) &=\bmod (S_{n+1},\, 10)=\bmod (S_n+(n+1)^2,\, 10)\\
&=\bmod\big(\bmod(S_n,\,10)+ \bmod\left((n+1)^2,\, 10\right),\, 10\Big)\\
&=\bmod\Big(g(n)+\bmod\left((n+1)^2,\, 10\right),\, 10\Big)
\end{align*}
からスタートして
「 を 10 で割った余り 4 を足して 10 で割る」のような計算を 20 回やることは手計算でも簡単でしょう。
の 1 の位が 5 になるのは が 2, 5, 9, 10, 14, 17 のときで 6 回あります。
答えはこの 倍なので「300 回」です。
足してから割る
を利用します。
とおきます。
の 1 の位が 5 のとき とおけて を 60 で割った余りは 30 です。
法が 60 では手計算で解く気がおきないので, を利用して法を小さくします。
法として 3, 4, 5 をとると条件はこうなります。
は整数なので は 6 の倍数で, はつねに成立します。
の条件として考えないといけないのは と です。
まず で考えます。 の条件は「 または または 」です。
のとき 。 は次のように変形できます。
まとめると です。
次は で考えます。
は整数係数で が使えるので
, , を 4 で割った余りを調べるのが手っ取りばやいです。
余りが 2 になる条件は です。
1~ で考えると(1)(2)をみたす は 2, 5, 9, 10, 14, 17 の 6 個。
答えはこの 倍なので「300 回」です。
おまけ:プログラムで計算
項が 1000 個しかないので愚直にコードを書いても十分高速です。約 0.003 秒でした。
In[]:= AbsoluteTiming[ f[n_] := Mod[n (n + 1) (2 n + 1)/6, 10] == 5; ans = Length@Select[Range@1000, f]] Out[]= {0.0030521, 300}