Submission #27677553


Source Code Expand

#include <cassert>
#include <cstdint>
#include <iostream>
#include <vector>
#include <string>
using namespace std;


constexpr uint32_t totient(uint32_t x){
    uint32_t ans = x;
    for(uint32_t i = 2; i * i <= x; i++) if(x % i == 0){
        ans /= i;
        ans *= i - 1;
        do x /= i; while(x % i == 0);
    }
    if(x != 1){
        ans /= x;
        ans *= x - 1;
    }
    return ans;
}
template<uint32_t P> struct Modint{
    static_assert(P < 0x80000000, "P must be smaller than 2^31");
    uint32_t a;
    Modint<totient(P)> b;
private:
    static uint32_t mod(uint64_t x){
        if(x < P * 2) return uint32_t(x);
        return uint32_t(x % P) + P;
    }
    static uint32_t mul(uint32_t a, uint32_t b){
        return mod(uint64_t(a) * b);
    }
    static uint32_t pow(uint32_t a, uint32_t b){
        uint32_t ans = 1;
        while(b){
            if(b & 1) ans = mul(ans, a);
            a = mul(a, a);
            b >>= 1;
        }
        return ans;
    }
public:
    Modint(uint64_t x): a(mod(x)), b(x){}
    Modint(uint32_t a, Modint<totient(P)> b): a(a), b(b){}
    uint32_t val() const {
        if(a < P) return a;
        return a - P;
    }
    Modint& operator*=(const Modint& other){
        a = mul(a, other.a);
        b *= other.b;
        return *this;
    }
    Modint operator*(const Modint& other) const {
        return Modint(*this) *= other;
    }
    Modint& operator+=(const Modint& other){
        a += other.a;
        if(a >= P * 2) a -= P;
        if(a >= P * 2) a -= P;
        b += other.b;
        return *this;
    }
    Modint operator+(const Modint& other) const {
        return Modint(*this) += other;
    }
    Modint pow(const Modint& other) const {
        return {pow(a, other.b.a), b.pow(other.b)};
    };
};
template<> struct Modint<1>{
    uint32_t a;
    Modint(uint64_t x): a(bool(x)){}
    uint32_t val() const {
        return 0;
    }
    Modint& operator*=(const Modint& other){
        a &= other.a;
        return *this;
    }
    Modint operator*(const Modint& other) const {
        return Modint(*this) *= other;
    }
    Modint& operator+=(const Modint& other){
        a |= other.a;
        return *this;
    }
    Modint operator+(const Modint& other) const {
        return Modint(*this) += other;
    }
    Modint pow(const Modint& other) const {
        return {a || !other.a};
    }
};


using M = Modint<1000000009>;
string get_char(string_view s){
    if(s.empty()) return "";
    return {s.end() - 3, s.end()};
}
void next(string_view& s){
    s = s.substr(0, s.size() - 3);
}
const vector<string> digit = {"〇", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
M 一(string_view& s){
    const auto p = find(digit.begin(), digit.end(), get_char(s));
    if(p == digit.end()) return 0;
    next(s);
    return p - digit.begin();
}
M 二(string_view& s){
    const auto p = find(digit.begin(), digit.end(), get_char(s));
    if(p == digit.end()) return 1;
    next(s);
    return p - digit.begin();
}
M 十(string_view& s){
    M a = 一(s);
    if(get_char(s) != "十") return a;
    next(s);
    return 二(s) * 10 + a;
}
M 百(string_view& s){
    M a = 十(s);
    if(get_char(s) != "百") return a;
    next(s);
    return 二(s) * 100 + a;
}
M 千(string_view& s){
    M a = 百(s);
    if(get_char(s) != "千") return a;
    next(s);
    return 二(s) * 1000 + a;
}
M 万(string_view& s){
    M a = 千(s);
    if(get_char(s) != "万") return a;
    next(s);
    return 千(s) * 10000 + a;
}
M 億(string_view& s){
    M a = 万(s);
    if(get_char(s) != "億") return a;
    next(s);
    return 千(s) * 1'0000'0000 + a;
}
M expression(string_view& s){
    if(get_char(s) != "乗") return 億(s);
    next(s);
    M b = expression(s);
    assert(get_char(s) == "の");
    next(s);
    M a = expression(s);
    return a.pow(b);
}
string encode(uint32_t x){
    function<string(uint32_t)> f = [&](uint32_t x){
        if(x >= 100000000) return f(x / 100000000) + "億" + f(x % 100000000);
        if(x >= 10000) return f(x / 10000) + "万" + f(x % 10000);
        if(x >= 2000) return f(x / 1000) + "千" + f(x % 1000);
        if(x >= 1000) return "千" + f(x % 1000);
        if(x >= 200) return f(x / 100) + "百" + f(x % 100);
        if(x >= 100) return "百" + f(x % 100);
        if(x >= 20) return f(x / 10) + "十" + f(x % 10);
        if(x >= 10) return "十" + f(x % 10);
        return vector<string>{"", "一", "二", "三", "四", "五", "六", "七", "八", "九"}[x];
    };
    string ans = f(x);
    if(ans.empty()) ans = "〇";
    return ans;
}
int main(){
    string s;
    cin >> s;
    string_view p = s;
    cout << encode(expression(p).val()) << endl;
}

Submission Info

Submission Time
Task J - Japanese Exponentation
User tatyam
Language C++ (Clang 10.0.0)
Score 100
Code Size 4691 Byte
Status AC
Exec Time 59 ms
Memory 11400 KiB

Judge Result

Set Name Sample Small Large
Score / Max Score 0 / 0 20 / 20 80 / 80
Status
AC × 4
AC × 49
AC × 80
Set Name Test Cases
Sample sample-01.txt, sample-02.txt, sample-03.txt, sample-04.txt
Small sample-01.txt, sample-02.txt, sample-03.txt, sample-04.txt, 01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, 01-11.txt, 01-12.txt, 01-13.txt, 01-14.txt, 01-15.txt, 01-16.txt, 01-17.txt, 01-18.txt, 01-19.txt, 01-20.txt, 01-21.txt, 01-22.txt, 01-23.txt, 01-24.txt, 01-25.txt, 01-26.txt, 01-27.txt, 01-28.txt, 01-29.txt, 01-30.txt, 01-31.txt, 01-32.txt, 01-33.txt, 01-34.txt, 01-35.txt, 01-36.txt, 01-37.txt, 01-38.txt, 01-39.txt, 01-40.txt, 01-41.txt, 01-42.txt, 01-43.txt, 01-44.txt, 01-45.txt
Large 01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, 01-11.txt, 01-12.txt, 01-13.txt, 01-14.txt, 01-15.txt, 01-16.txt, 01-17.txt, 01-18.txt, 01-19.txt, 01-20.txt, 01-21.txt, 01-22.txt, 01-23.txt, 01-24.txt, 01-25.txt, 01-26.txt, 01-27.txt, 01-28.txt, 01-29.txt, 01-30.txt, 01-31.txt, 01-32.txt, 01-33.txt, 01-34.txt, 01-35.txt, 01-36.txt, 01-37.txt, 01-38.txt, 01-39.txt, 01-40.txt, 01-41.txt, 01-42.txt, 01-43.txt, 01-44.txt, 01-45.txt, 02-01.txt, 02-02.txt, 02-03.txt, 02-04.txt, 02-05.txt, 02-06.txt, 02-07.txt, 02-08.txt, 02-09.txt, 02-10.txt, 02-11.txt, 02-12.txt, 02-13.txt, 02-14.txt, 02-15.txt, 02-16.txt, 02-17.txt, 02-18.txt, 02-19.txt, 02-20.txt, 02-21.txt, 02-22.txt, 02-23.txt, 02-24.txt, 02-25.txt, 02-26.txt, 02-27.txt, 02-28.txt, 02-29.txt, 02-30.txt, 02-31.txt, sample-01.txt, sample-02.txt, sample-03.txt, sample-04.txt
Case Name Status Exec Time Memory
01-01.txt AC 9 ms 2852 KiB
01-02.txt AC 2 ms 2924 KiB
01-03.txt AC 2 ms 3072 KiB
01-04.txt AC 3 ms 3012 KiB
01-05.txt AC 2 ms 3140 KiB
01-06.txt AC 2 ms 2968 KiB
01-07.txt AC 2 ms 3044 KiB
01-08.txt AC 2 ms 3044 KiB
01-09.txt AC 2 ms 3016 KiB
01-10.txt AC 2 ms 3072 KiB
01-11.txt AC 2 ms 2924 KiB
01-12.txt AC 3 ms 3044 KiB
01-13.txt AC 2 ms 3116 KiB
01-14.txt AC 3 ms 3124 KiB
01-15.txt AC 2 ms 3060 KiB
01-16.txt AC 3 ms 2956 KiB
01-17.txt AC 2 ms 3060 KiB
01-18.txt AC 2 ms 2916 KiB
01-19.txt AC 2 ms 3000 KiB
01-20.txt AC 2 ms 2924 KiB
01-21.txt AC 4 ms 2868 KiB
01-22.txt AC 2 ms 3016 KiB
01-23.txt AC 2 ms 2940 KiB
01-24.txt AC 6 ms 2928 KiB
01-25.txt AC 2 ms 2944 KiB
01-26.txt AC 6 ms 3064 KiB
01-27.txt AC 3 ms 3188 KiB
01-28.txt AC 2 ms 2960 KiB
01-29.txt AC 4 ms 2856 KiB
01-30.txt AC 2 ms 3152 KiB
01-31.txt AC 2 ms 2848 KiB
01-32.txt AC 3 ms 2928 KiB
01-33.txt AC 2 ms 2904 KiB
01-34.txt AC 2 ms 3152 KiB
01-35.txt AC 2 ms 3060 KiB
01-36.txt AC 2 ms 3132 KiB
01-37.txt AC 2 ms 2968 KiB
01-38.txt AC 2 ms 2936 KiB
01-39.txt AC 2 ms 2856 KiB
01-40.txt AC 2 ms 3012 KiB
01-41.txt AC 2 ms 3076 KiB
01-42.txt AC 2 ms 2996 KiB
01-43.txt AC 2 ms 2964 KiB
01-44.txt AC 2 ms 2860 KiB
01-45.txt AC 2 ms 3012 KiB
02-01.txt AC 31 ms 4196 KiB
02-02.txt AC 30 ms 4316 KiB
02-03.txt AC 36 ms 4212 KiB
02-04.txt AC 31 ms 4372 KiB
02-05.txt AC 32 ms 4100 KiB
02-06.txt AC 32 ms 4428 KiB
02-07.txt AC 32 ms 4404 KiB
02-08.txt AC 27 ms 4312 KiB
02-09.txt AC 33 ms 4216 KiB
02-10.txt AC 26 ms 4252 KiB
02-11.txt AC 28 ms 4200 KiB
02-12.txt AC 35 ms 4196 KiB
02-13.txt AC 30 ms 4252 KiB
02-14.txt AC 33 ms 4208 KiB
02-15.txt AC 59 ms 11400 KiB
02-16.txt AC 49 ms 3328 KiB
02-17.txt AC 28 ms 3148 KiB
02-18.txt AC 46 ms 3296 KiB
02-19.txt AC 41 ms 3148 KiB
02-20.txt AC 36 ms 3304 KiB
02-21.txt AC 30 ms 3444 KiB
02-22.txt AC 34 ms 3156 KiB
02-23.txt AC 31 ms 3224 KiB
02-24.txt AC 30 ms 3444 KiB
02-25.txt AC 29 ms 3156 KiB
02-26.txt AC 24 ms 11400 KiB
02-27.txt AC 29 ms 4316 KiB
02-28.txt AC 29 ms 3244 KiB
02-29.txt AC 32 ms 3140 KiB
02-30.txt AC 30 ms 3304 KiB
02-31.txt AC 31 ms 4380 KiB
sample-01.txt AC 2 ms 3060 KiB
sample-02.txt AC 2 ms 2928 KiB
sample-03.txt AC 3 ms 3152 KiB
sample-04.txt AC 2 ms 3152 KiB