ABC 341
Table of Contents
D - Only one of two
https://atcoder.jp/contests/abc341/tasks/abc341_d
解説 AC
$x$ 以下の整数のうち $N$, $M$ のいずれか一方のみで割り切れるものの個数を $f(x)$ とすると
\begin{align*} f(x) = \floor{\frac{x}{N}} + \floor{\frac{x}{M}} - 2 \cdot \floor{\frac{x}{\text{lcm}(N, M)}} \end{align*}
である。
$f(x) \geq K$ となる最小の $x$ を二分探索で求めれば良い。
void solve() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
ll N, M, K;
cin >> N >> M >> K;
auto f = [&](ll x) -> ll {
ll numn = x / N;
ll numm = x / M;
ll numc = x / lcm(N, M);
return numn + numm - numc * 2;
};
ll wa = 0, ac = INF;
while (ac - wa > 1) {
ll wj = (ac + wa) / 2;
if (f(wj) >= K)
ac = wj;
else
wa = wj;
}
cout << ac << endl;
}
E - Alternating String
https://atcoder.jp/contests/abc341/tasks/abc341_e
解説 AC