Yuulis.log

トンネルを抜けるとそこは参照エラーであった。

【AtCoder】ABC 345 B - Integer Division Returns | 茶コーダーが解くAtCoder

atcoder.jp

実行時間制限: 2 sec / メモリ制限: 1024 MB / Difficulty: 91

問題概要

 10^{-18} \leq X \leq 10^{18} を満たす整数  X について、 \lceil \frac{X}{10} \rceil を出力せよ。

制約

  • 問題概要の通り

考察

AtCoder頻出の除算と天井関数に関する問題。 C++ を使う上でこのようなケースに遭遇したときに気を付けるべきことは2つ。

  • C++ 標準ライブラリにあるceil関数は、引数にdouble型をとるので、だいたい  10^{15} ぐらいの精度までしかない。
  • C++ の除算で割り切れないときは、  0 方向へ丸める。つまり、ceil(a / b)の結果は  \lceil \frac{a}{b} \rceil等しくならない

この問題を回避するために、 a, b > 0 のときは  \lceil \frac{a}{b} \rceil = \lfloor \frac{a + b - 1}{b} \rfloor という公式を使うことができる。

また、 a < 0, b > 0 のときは、ただ単に  \frac{a}{b} を実行すればよい。

この記事が詳しいので興味あれば参照のこと。

qiita.com

私は自作のceil関数を利用した。

コード

#include <bits/stdc++.h>
using namespace std;

ll ceil(ll a, ll b)
{
    if (a % b == 0)
        return a / b;
    return (a / b) + 1;
}

// ======================================== //

int main()
{
    ll X;
    cin >> X;

    if (X > 0)
        cout << ceil(X, 10) << endl;
    else
        cout << X / 10 << endl;
}

atcoder.jp

実装時間: 5分以内