ABC 439
Table of Contents
https://atcoder.jp/contests/abc439
A. 2^n - 2*n
https://atcoder.jp/contests/abc439/tasks/abc439_a
void solve() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
ll N;
cin >> N;
cout << (1ll << N) - (N * 2) << endl;
}
B. Happy Number
https://atcoder.jp/contests/abc439/tasks/abc439_b
void solve() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
ll N;
cin >> N;
set<ll> memo;
while (N != 1) {
ll sum = 0;
while (N) {
ll m = N % 10;
sum += m * m;
N /= 10;
}
if (memo.count(sum)) {
No();
return;
}
memo.insert(sum);
N = sum;
}
Yes();
}
C. 2026
https://atcoder.jp/contests/abc439/tasks/abc439_c
$x \leq \sqrt{N}$, $y \leq \sqrt{N}$ であるので $(x,y)$ の全探索を行っても $O(N)$ で解ける。
void solve() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
ll N;
cin >> N;
vll used(N + 1);
for (int i = 1; i * i <= N; i++) {
for (int j = i + 1; j * j <= N; j++) {
ll sq = i * i + j * j;
if (sq > N) continue;
used[sq]++;
}
}
vll ans;
rep(i, N + 1) {
if (used[i] == 1) ans.push_back(i);
}
cout << ans.size() << endl;
print(ans);
}
D. Kadomatsu Subsequence
https://atcoder.jp/contests/abc439/tasks/abc439_d
$A_i : A_j : A_k = 7 : 5 : 3$ であるから
$A_i = \frac{7 A_j}{5}$, $A_k = \frac{3 A_j}{5}$ がともに整数にならなければならないので $A_j$ は 5 の倍数である必要がある。 $A_j$ が決まれば $A_i, A_k$ も一意に決まるので、あとは条件を満たす $i, k$ の個数を数え上げればよい。
特定の $j$ について、$\min(i,j,k) = j \wedge A_i : A_j : A_k = 7 : 5 : 3$ を満たす組の個数は $i < j$ かつ $A_i = \frac{7 A_j}{5}$ であるような $i$ の個数と $k < j$ かつ $A_k = \frac{3 A_j}{5}$ であるような $k$ の個数の積になる。
同様にして $\max(i,j,k) = j \wedge A_i : A_j : A_k = 7 : 5 : 3$ を満たす組の個数は $i > j$ かつ $A_i = \frac{7 A_j}{5}$ であるような $i$ の個数と $k > j$ かつ $A_k = \frac{3 A_j}{5}$ であるような $k$ の個数の積になる。
これらの和が答えになる。
void solve() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
ll N;
cin >> N;
vll A(N);
rep(i, N) cin >> A[i];
map<ll, vll> mp;
rep(i, N) {
mp[A[i]].push_back(i);
}
ll ans = 0;
for (int j = N - 1; j >= 0; j--) {
if (A[j] % 5 != 0) continue;
ll lx = A[j] / 5 * 7;
ll rx = A[j] / 5 * 3;
ll numl = lower_bound(all(mp[lx]), j) - mp[lx].begin();
ll numr = lower_bound(all(mp[rx]), j) - mp[rx].begin();
ans += numl * numr;
}
rep(j, N) {
if (A[j] % 5 != 0) continue;
ll lx = A[j] / 5 * 7;
ll rx = A[j] / 5 * 3;
ll numl = mp[lx].end() - lower_bound(all(mp[lx]), j);
ll numr = mp[rx].end() - lower_bound(all(mp[rx]), j);
ans += numl * numr;
}
cout << ans << endl;
}
E. Kite
https://atcoder.jp/contests/abc439/tasks/abc439_e
解説 AC
void solve() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
ll N;
cin >> N;
vll A(N), B(N);
rep(i, N) cin >> A[i] >> B[i];
using P = pair<ll, ll>;
vector<P> ps;
rep(i, N) {
ps.emplace_back(A[i], B[i]);
}
sort(all(ps), [](P a, P b) -> bool {
if (a.first != b.first) return a.first < b.first;
return a.second > b.second;
});
vll v(N, INF);
rep(i, N) {
auto [_, b] = ps[i];
auto it = lower_bound(all(v), b);
*it = b;
}
ll ans = 0;
rep(i, N) {
if (v[i] != INF) ans++;
}
cout << ans << endl;
}
F. Beautiful Kadomatsu
https://atcoder.jp/contests/abc439/tasks/abc439_f