Post

【精進6】ABC387-E

【精進6】ABC387-E

前回のABCのupsolve。答え見ちゃったけど思ったよりギャグ

問題

自然数について、自身の桁和が自身を割り切るとき良い整数と呼ぶ。$N\le a<2N$かつ$a,a+1$がともに良い整数となるような$a$が存在するならば$1$つ求めよ。

解法

$a$が$8$の倍数かつ桁和が$8$で、$a+1$の桁和が$9$であるような$N\le a<2N$は条件を満たす。

これだけ。小さい$N$については愚直に求める。$N$が大きいときは$a$の下$3$桁を$0$にすることで$8$の倍数であるという条件と、$a+1$の桁和が$9$であるという条件が満たされる。あとは上の方の数字を少し増やして桁和が$8$となるよう調整すれば良い。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include "template.hpp"
ll keta(ll n) {
    ll res = 0;
    while(n > 0) {
        res += n % 10;
        n /= 10;
    }
    return res;
}
void naive(ll n) {
    ll original = n;
    while(1) {
        if(n + 1 > original * 2) {
            print(-1);
            return;
        }
        if(n % keta(n) == 0 and (n + 1) % keta(n + 1) == 0) {
            print(n);
            return;
        }
        n++;
    }
}
void solve() {
    STR(s);
    ll n = ssize(s);
    if(n <= 6) {
        naive(stoll(s));
        return;
    }
    ll x = 0;
    rep(i, 3) x = 10 * x + (s[i] - '0');
    x++;
    while(1) {
        if(keta(x) == 8) {
            cout << x;
            rep(i, n - 3) cout << 0;
            print();
            return;
        }
        x++;
    }
}

int main() {
    ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    cout << std::setprecision(16);
    int t = 1;
    rep(_, t) {
        solve();
    }
}

This post is licensed under CC BY 4.0 by the author.