B - Si Stebbins System

2 secs 1024 MB
uni_kakurenbo's icon uni_kakurenbo

概要

実際のトランプマジックで用いられている仕込みを題材にした問題です.

愚直なアルゴリズムでは正解できません.
少しだけ,工夫をしましょう.

問題原案:tnodino

略解

数列 AA は長さ 1313 の周期を持ちます.これを埋め込めばよいです.
剰余は最後にとるとして,等差数列と見るとより短い記述で正解できます.(本文 .Ⅳ. 参照)

解説

.Ⅰ. 愚直な実装

問題の内容をそのまま実装することで,数列 AA の値を求めることはできます.
数列の表現には「配列」を用いるとよいでしょう.

.Ⅱ. コンピュータの限界

一般的な家庭用コンピュータにできる計算の限界は,20222022 年現在 10810^8 回/秒 程度であると言われています.

愚直なアルゴリズムによってこの問題を解こうとすると,時間計算量は O(K)O(K) になります.
入力されうる KK の最大値が 10910^9 であることを考えると,そのままでは実行時間制限に間に合わないだろうということが分かります.

.Ⅲ. 実験と考察

先述した理由により愚直なアルゴリズムでこの問題に正解することはできません.
しかし,計算にかかる時間を気にしなければ正しい答えを出力します.
試しにこのプログラムを用いて,AA の値を少し計算してみましょう.手計算でもよいです.

すると,A=(0,3,6,9,12,2,5,8,11,1,4,7,10,0,3,6,)A = (\underline{0, 3, 6, 9, 12, 2, 5, 8, 11, 1, 4, 7, 10}, 0, 3, 6, \ldots) となります.
数列 AA は長さ 1313 の周期を持って,同じ値の列を繰り返すことに気付いたでしょうか.

これをコード内に埋め込むことで,O(1)O(1) 時間で答えを求めることができます.

.Ⅳ. よりシンプルな解法

数列 BBB1=0,Bi+1=Bi+3(i1)B_1 = 0, B_{i+1} = B_i + 3 \hspace{0.3em}\scriptsize (i \geq 1) とします.
すると,加減乗算において剰余はどこでとっても結果が変わらないので,Ai=Bimod13A_i = B_i \bmod 13 と表されます.
(詳しい証明などは他サイト様へ委ねます.)

数列 BB は,初項が 00, 公差が 33 の等差数列となるので, Bi=3(i1)B_i = 3(i - 1) と表現できることが分かります.

したがって,3(i1)mod133(i - 1) \bmod 13 を出力すればよいです.

.Ⅴ. 発展

1)1) 類題

実装例

C++
Python
Python