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 |
|
|
|
| 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 |