Rustコトハジメ

プログラミング言語Rustと競プロに関する情報をお届けします。

Rustはmodの挙動がPythonなどと違うので注意

競プロでは、modをとることがよくありますが、Rustでは(たぶんC++でも?)注意が必要です。

fn main()
{
    dbg!(-7%3);
    dbg!(-7%-3);
    dbg!(7%3);
    dbg!(7%-3);
}

は、

[prog.rs:5] -7 % 3 = -1
[prog.rs:6] -7 % -3 = -1
[prog.rs:7] 7 % 3 = 1
[prog.rs:8] 7 % -3 = 1

と出力します。

同様の計算をPythonでやってみます。

>>> -7 % 3
2
>>> -7 % -3
-1
>>> 7 % 3
1
>>> 7 % -3
-2

Pythonでは、modが正の場合は、計算結果も正にしてくれるので、競プロの範囲ではこの挙動の方が使いやすいと思いますが(なぜならば、大体109+7など正の値がmodとして使われるからです)、Rustは同様の挙動をしません。

Pythonではa%bのうちbの符号に、Rustではaの符号に依ってることがわかります。従って、一度aの側が負になってしまったりするとめんどくさいことになります。

modを計算して出力する系の問題で、時々部分的にWAすることがあり、結構苛ついてきたため、そろそろModIntクラスを作ってやろうかと思い始めています。雑音にならないようにきれいに実装出来ればいいんですが。