【競プロ】余りを切り上げる
この記事は、Gajeroll Advent Calendar 2022 の 13 日目の記事です。
今回の記事は、競技プログラミングでも定番の、割り算において余りを切り上げる処理についてです。
例えば、以下の ABC176 A 問題では N 個のたこ焼きを X 個ずつ作るときに、何回作る必要があるのかを求めます。
ABC176 A 問題
結論
A ÷ B を切り上げた値は
⌊ba+b−1⌋
と表現することができます。
プログラム例
先ほどの ABC176 A 問題 の Python での回答例は以下のようになります。
n, x, t = map(int, input().split())
count = (n + x - 1) // x
res = count * t
print(res)
また、count
を求める部分は、
- n が x で割り切れる場合には、n ÷ x
- n が x で割り切れない場合には、n ÷ x + 1
となるので、
if (n % x == 0)
count = n // x
else
count = n // x + 1
と書くこともできます。
証明
任意の正の整数 a,b に対して、
⌈ba⌉=⌊ba+b−1⌋
が成り立つことを証明する。
- a=bk (k=1,2,3,…) のとき、
⌈ba⌉=⌈bbk⌉=⌈k⌉=k⌊ba+b−1⌋=⌊bbk+b−1⌋=⌊k+bb−1⌋=k(∵0≤b−1<b)
- a=bk+l (l=1,2,…,b−1) のとき,
⌈ba⌉=⌈bbk+l⌉=⌈k+bl⌉=k+1(∵0<l<b)⌊ba+b−1⌋=⌊bbk+l+b−1⌋=⌊k+1+bl−1⌋=k+1(∵0≤l−1<b)
おわりに
最後までご覧いただきありがとうございます。
PC ロールでは、テクノロジーに関する情報をまとめて
発信しています。
また、おすすめのガジェットについて幅広く紹介していく、ガジェロールもあります。
ガジェットやソフトを使うエンジニア・クリエイターはぜひご覧ください。