Official

I - /2 and *3 Editorial by physics0523


まず、操作が可能な場合は、(適切な操作を行えば)最小値が損をすることはありません。これは、操作が可能である場合、偶数である項 \(A_i\) を選んで、この項に対して \(2\) で割ってから \(3\) をかけるという操作を行うことで、元の最小値がさらに小さくなるということはないからです。

このことから、次に、

まず、数列の中から偶数である項を \(1\) つ選び、その項を \(2\) で割る。次に、数列の中から任意の項を \(1\) つ選び、その項を \(3\) 倍する。

という操作を以下のように言い換えても問題ないことが分かります。

まず、数列の各項を、 \(2\) で割り切れなくなるまで \(2\) で割る。この時、割ることができた合計の回数を \(k\) とする。 その後、数列の任意の項を選んで \(3\) 倍するということを \(k\) 回繰り返す。

明らかに、\(3\) 倍する項は、各操作ごとに「現時点での数列の中での最小の項」を選べばよいです。
このシミュレーションは、 priority_queue を使えば実行可能です。

実装上では、 \(32\)bit 整数型ではオーバーフローしてしまいますが、 \(64\)bit 整数型を使えば十分です。 厳密な証明は省略しますが、(本来は制約違反ですが) \(A=(2^{30},2^{30},2^{30},\dots)\) の場合の答えが \(3^{30}\) となり、この問題の制約下では全てのテストケースでこの場合よりも答えが小さくなるという考察から \(64\)bit 整数型で十分であることが分かります。

posted:
last update: