最大公約数・最小公倍数が絡んでくる問題向けライブラリです
例えば以下の問題で役に立ちます
AtCoder Beginner Contest 162 C - Sum of gcd of Tuples (Easy)
AtCoder Beginner Contest 253 D - FizzBuzz Sum Hard
final class GcdLcmCalculator {
/**
* ユークリッドの互除法を利用して2整数の最大公約数を取得する
* @param a 整数
* @param b 整数
* @return aとbの最大公約数
*/
public static final long calculateGcd(long a, long b) {
if (b == 0) {
return a;
}
return calculateGcd(b, a % b);
}
/**
* 2整数の最小公倍数を取得する
* @param a 整数
* @param b 整数
* @return aとbの最小公倍数
*/
public static final long calculateLcm(long a, long b) {
return a / calculateGcd(a, b) * b;
}
}
整数の約数一覧を取得するライブラリです
例えば以下の問題で役に立ちます
AtCoder Beginner Contest 249 D - Index Trio
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;
final class DivisorHelper {
/**
* 整数の約数一覧を取得する
* @param n 対象の整数
* @return nの約数リスト
*/
public static final List<Long> getDivisorsOf(long n) {
Deque<Long> less = new ArrayDeque<Long>();
Deque<Long> greater = new ArrayDeque<Long>();
for (long d = 1; d * d <= n; ++d) {
if (n % d != 0) {
continue;
}
less.addLast(d);
long q = n / d;
if (d != q) {
greater.addLast(q);
}
}
List<Long> res = new ArrayList<Long>();
while (!less.isEmpty()) {
res.add(less.pollFirst());
}
while (!greater.isEmpty()) {
res.add(greater.pollLast());
}
return res;
}
}