@drkenさんのAtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~
内で、aをbで割った時の商(余りは切り上げとする)は次の式の商に等しいことが述べられています。
\frac{a+b-1}{b}
この式についての情報は検索しても特に見つからなかったのでここで説明を試みます。
この式に名前はついているのでしょうか?端数処理の一種でしょうか。。
知っている人がいたら教えてください。
目次
章 | タイトル | 備考 |
---|---|---|
0. | 引用 | |
1. | Javaコード実装 | |
1.1. | 数式変換 | |
2. | 手順 | |
3. | その他 |
#0. 引用
以下、該当箇所の引用。
【コメント】
倍数判定はもっと広くとらえると「余りを求める処理」です。というのも「2 で割り切れる」というのは「2 で割った余りが 0 である」ということを意味するからです。
発展的話題として「余りを切り上げる処理」があります。例えば、「17 人を 3 人ずつグループに分けて、余ったところは 1 つのグループとしたときに何グループできるか」という問題を考えると、
17 ÷ 3 = 5 あまり 2
で、3 人グループが 5 個と、余った 2 人によるグループが 1 個できるので、合計 6 個のグループができます。一般に、「a 人を b 人ずつグループに分けると何グループできるか?」は
- a が b で割り切れるとき: a/b
- a が b で割り切れないとき: a/b + 1
になります。しかし実はこれをまとめて (a + b - 1) / b と簡潔に書くことができます。今後頻繁に使うことになるテクニックなので習得しておきたいところです。
#1. Javaコード実装
まずは余りがあるかないかで場合分けするコードを書いてみます。
public class Main {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
//b≠0,aとbは整数
int a = sc.nextInt();
int b = sc.nextInt();
int q = 0;
if(a % b != 0){
q = (a/b) +1;
}
else{
q = a/b;
}
System.out.println("余りを切り上げた商は" + q);
}
}
式を使うとif文がなくなって次のようになります。
public class Main {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
int q = 0;
q = (a+b-1)/b;
System.out.println("余りを切り上げた商は" + q);
}
}
#1.1. 数式変換
式は次のように変形できる。
\frac{a+b-1}{b}=\frac{a-1}{b}+1
① $\frac{a}{b}$に余りがある時は$\frac{a-1}{b}$と$\frac{a}{b}$の商は同じなので、商についてのみ考えると次の等式が成り立つ。
\begin{align}
\frac{a+b-1}{b}&=\frac{a-1}{b}+1\\
&=\frac{a}{b}+1
\end{align}
② $\frac{a}{b}$に余りがない時は$\frac{a-1}{b}$の商は$\frac{a}{b}$の商より1だけ小さいので、商についてのみ考えると次の等式が成り立つ。
\begin{align}
\frac{a+b-1}{b}&=\frac{a-1}{b}+1\\
&=(\frac{a}{b}-1)+1\\
&=\frac{a}{b}
\end{align}
①、②は場合分けして書いたコードと同じものである。
#2. 手順
手順で説明すると、
- a個をb個ずつのグループに分けていく
- 端数か否かに関わらず最後のグループから1個を引く
- b個を含むグループの数を数え上げる ($\frac{a-1}{b}$の余りを切り捨てた商を求める)
- その結果に1を足す
#3. その他
公式をパッと見ただけでは覚えられない人 (私です) が競技プログラミングをやっていく際の参考になれば嬉しいです。