AtCoder部 2026-03-11
ABC357 D - 88888888
ダブリング。
int main() {
ll N;
cin >> N;
ull w = 1;
while (w <= N) w *= 10;
vector<mint> a(60);
a[0] = N;
for (int i = 1; i < 60; i++) {
a[i] = a[i - 1] * mint(w).pow(1LL << (i - 1)) + a[i - 1];
}
mint ans = 0;
for (int i = 59; i >= 0; i--) {
if (BIT(N, i)) {
ans = ans * mint(w).pow(1LL << i) + a[i];
}
}
cout << ans.val() << NL;
}
ABC359 C - Tile Distance 2
スタートとゴールをタイルの左側に寄せておく(これは x+y が奇数なら x を 1 減らすとすればいい)。
y 方向に 1 移動するときは必ずコスト 1 かかる。ただし、y 方向に 1 移動するとき、追加コストなしで x 方向に 1 移動できる。それで足りない分については、 x 方向に 2 移動するごとにコスト 1 かかる。結局、合計コストは となる。
int main() {
ll sx, sy, tx, ty;
cin >> sx >> sy >> tx >> ty;
if ((sx + sy) % 2) sx--;
if ((tx + ty) % 2) tx--;
ll dx = abs(tx - sx), dy = abs(ty - sy);
ll ans = dy + max(dx - dy, 0LL) / 2;
cout << ans << NL;
}
ABC389 D - Squares in Circle
対称性から かつ を満たす を数えればよい。 各 について条件を満たす の個数を数えて足し合わせることにする。 を固定すると、 が満たすべき条件は となる。 のときは明らかに条件を満たす が存在しないから、 未満の だけ考えればいい。
int main() {
double R;
cin >> R;
ll ans = 0;
for (int i = 0; i < R; i++) {
double j = sqrt(R * R - (i + 0.5) * (i + 0.5)) - 0.5;
int cnt = 0;
if (j >= 0) {
cnt += floor(j) * 2 + 1;
}
if (i == 0)
ans += cnt;
else
ans += cnt * 2;
}
cout << ans << NL;
}