long long型
概要
int 型より大きな数を扱える整数型。
long long 型は $64$ ビットの整数型(AtCoder環境の場合)。
符号用の $1$ ビットと、値の大きさ用の $63$ ビットを使う。
そのため、扱える値の範囲は $-9{,}223{,}372{,}036{,}854{,}775{,}808$ から $9{,}223{,}372{,}036{,}854{,}775{,}807$ まで。
およそ $\pm 9 \times 10^{18}$ くらいまでは大丈夫で、それを超えると危ないと認識するとよい。
整数リテラルの後ろに LL を付けると、long long 型になる。
1LL
宣言と初期化
宣言だけする場合
long long a;
初期化もする場合
long long a = 0LL; // 固定値で初期化。0 とだけ書いても変換されるので問題ない
long long b = a; // 他の整数型や double 型の変数で初期化
可能な演算
long long 型では、int 型とほぼ同じ演算ができる。
詳しくは「int型」の記事参照。
よく使う処理
long long 型でも、int 型とほぼ同じ処理ができる。
詳しくは「int型」の記事参照。
文字列化
long long 型の数 a を string 型に変換したい場合、以下のようにする。
to_string(a)
逆に、string 型の文字列 s を long long 型にしたい場合、以下のようにする。
stoll(s)
ただし、変換後の値が long long 型に収まるかどうかを確認すること。
int 型の積が一時的に範囲を超える場合
例えば、$10^6$ 程度の int 型の数 a と b を掛け、$10^7$ 程度の数 c で割った余りを求める場合を考える。
(a*b)%c
このように書くと、掛け算の時点では int 型として計算される。
a*b が int 型の範囲を超えるため、最後の結果も正しくならない。
(1LL*a*b)%c
このように 1LL を掛けると、long long 型として計算されるため、途中のオーバーフローを防げる。
注意点
int 型と同様に、桁あふれや負数の除算などに注意する。
詳しくは「int型」の記事参照。
long long 型でも桁あふれしそうな場合は、別の計算方法を考えた方がよいことが多い。
さらに大きな桁数を扱う型を持ち出すのは大変だし、たいていの場合その方法は想定解ではない。
関連アルゴリズム
int型
long long 型より小さい整数を扱う、最も代表的な整数型。
可能な演算やよく使う処理は、long long 型とほぼ同じ。
string型
文字列を扱う型。
to_string で long long 型から変換でき、stoll で long long 型へ変換できる。