Submission #49396553


Source Code Expand

#include <bits/stdc++.h>
#include <atcoder/modint>

namespace {
    using ModInt [[maybe_unused]] = atcoder::modint998244353;
    using Num [[maybe_unused]] = long long int;
    using Vec [[maybe_unused]] = std::vector<Num>;
    using Set [[maybe_unused]] = std::set<Num>;
    using Mset [[maybe_unused]] = std::multiset<Num>;
    using Edges [[maybe_unused]] = std::vector<std::vector<Num>>;

    template<typename T>
    using Q [[maybe_unused]] = std::queue<T>;

    template<typename T>
    using PQ [[maybe_unused]] = std::priority_queue<T, std::vector<T>, std::greater<T>>;
}

const Num n_digits = 15;
const Num max_sum = 9*14;
Num dp[n_digits+1][max_sum+2][max_sum+2][2];

void solve(std::istream& is, std::ostream& os) {
    std::string s;
    is >> s;

    Num answer {0};
    for(Num total{1}; total<=max_sum; ++total) {
        const auto len = s.size();
        std::vector dp(len + 1, std::vector(total + 1, std::vector(total + 1, std::vector(2, 0LL))));
        dp.at(0).at(0).at(0).at(1) = 1;

        for(size_t index{0}; index<len; ++index) {
            const auto digit = s.at(index) - '0';
            for(Num sum{0}; sum<=max_sum; ++sum) {
                for(Num rem{0}; rem<total; ++rem) {
                    for(Num gt{0}; gt<2; ++gt) {
                        for(Num t{0}; t<10; ++t) {
                            const auto new_sum = sum + t;
                            if (new_sum > total) {
                                continue;
                            }

                            if (gt & (digit < t)) {
                                continue;
                            }

                            const Num new_rem = (rem * 10 + t) % total;
                            const Num new_gt = gt && (digit == t);
                            dp[index+1][new_sum][new_rem][new_gt] += dp[index][sum][rem][gt];
                        }
                    }
                }
            }
        }

        answer += dp[len][total][0][0] + dp[len][total][0][1];
    }

    os << answer << "\n";
}

int main(void) {
    solve(std::cin, std::cout);
    return 0;
}

Submission Info

Submission Time
Task E - Digit Sum Divisible
User zettsut
Language C++ 20 (gcc 12.2)
Score 525
Code Size 2174 Byte
Status AC
Exec Time 925 ms
Memory 18772 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 525 / 525
Status
AC × 3
AC × 9
Set Name Test Cases
Sample 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt
All 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 01_random_00.txt, 01_random_01.txt, 02_max_00.txt, 02_max_01.txt, 03_min_00.txt, 04_corner_00.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 136 ms 7244 KiB
00_sample_01.txt AC 241 ms 9024 KiB
00_sample_02.txt AC 588 ms 14292 KiB
01_random_00.txt AC 800 ms 17880 KiB
01_random_01.txt AC 849 ms 17788 KiB
02_max_00.txt AC 758 ms 18772 KiB
02_max_01.txt AC 925 ms 17888 KiB
03_min_00.txt AC 87 ms 6356 KiB
04_corner_00.txt AC 602 ms 13400 KiB