#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
namespace {
constexpr std::size_t size = 19;
int result[size];
long long simple_case(int num) {
return static_cast<long long>(num+1);
}
long long two_digit(int num) {
num += 10;
return 18 - num + 1;
}
long long count(int pos) {
long long c1 = 0;
long long c2 = 0;
if(pos == size -1){
return simple_case(result[pos]);
}
//one digit case:
c1 = simple_case(result[pos]) * count(pos+1);
//two digit case:
if(result[pos] < 9 && result[pos+1] == 1) {
c2 = two_digit(result[pos]);
if(pos < size - 2) {
c2 *= count(pos+2);
}
}
return c1 + c2;
}
}
int main(void) {
std::memset(result, 0, size);
char number[size];
std::memset(number, '0', size);
std::cin >> number;
for(int i=0; i<size; ++i) {
result[i] = number[i] - 48;
}
if(std::strlen(number) == 1) {
std::cout << simple_case(result[0]);
return 0;
}
long long counter = 0;
std::reverse(result, result+size);
for(int i=0; i<size; ++i) {
if(result[i] == -48) {
// std::cout << "start:";
counter = count(i+1);
break;
} else {
// std::cout << result[i] << ", ";
}
}
std::printf("%lld ", counter);
return 0;
}
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 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> namespace { constexpr std::size_t size = 19; int result[size]; long long simple_case(int num) { return static_cast<long long>(num+1); } long long two_digit(int num) { num += 10; return 18 - num + 1; } long long count(int pos) { long long c1 = 0; long long c2 = 0; if(pos == size -1){ return simple_case(result[pos]); } //one digit case: c1 = simple_case(result[pos]) * count(pos+1); //two digit case: if(result[pos] < 9 && result[pos+1] == 1) { c2 = two_digit(result[pos]); if(pos < size - 2) { c2 *= count(pos+2); } } return c1 + c2; } } int main(void) { std::memset(result, 0, size); char number[size]; std::memset(number, '0', size); std::cin >> number; for(int i=0; i<size; ++i) { result[i] = number[i] - 48; } if(std::strlen(number) == 1) { std::cout << simple_case(result[0]); return 0; } long long counter = 0; std::reverse(result, result+size); for(int i=0; i<size; ++i) { if(result[i] == -48) { // std::cout << "start:"; counter = count(i+1); break; } else { // std::cout << result[i] << ", "; } } std::printf("%lld ", counter); return 0; } |
English