#include <array>
#include <cstdio>
#include <cstring>
constexpr size_t ARRAY_LEN = 25;
int variants(char digit) {
return digit - '0' + 1;
}
int variantsTens(char *digits) {
if (digits[0] != '1' || digits[1] == '\0')
{
return 0;
}
return 19 - (10 + (digits[1] - '0'));
}
int main()
{
char notsum[ARRAY_LEN];
std::array<unsigned long long, ARRAY_LEN> partial;
partial.fill(1);
scanf("%s", notsum);
for (int i = strlen(notsum)-1; i >= 0; --i)
{
partial[i] = variants(notsum[i]) * partial[i+1];
fprintf(stderr, "partial[%d] = %llu * %d\n", i, partial[i+1], variants(notsum[i]));
partial[i] += partial[i+2] * variantsTens(notsum+i);
fprintf(stderr, "partial[%d] += %llu * %d\n", i, partial[i+2], variantsTens(notsum+i));
}
printf("%llu\n", partial[0]);
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 | #include <array> #include <cstdio> #include <cstring> constexpr size_t ARRAY_LEN = 25; int variants(char digit) { return digit - '0' + 1; } int variantsTens(char *digits) { if (digits[0] != '1' || digits[1] == '\0') { return 0; } return 19 - (10 + (digits[1] - '0')); } int main() { char notsum[ARRAY_LEN]; std::array<unsigned long long, ARRAY_LEN> partial; partial.fill(1); scanf("%s", notsum); for (int i = strlen(notsum)-1; i >= 0; --i) { partial[i] = variants(notsum[i]) * partial[i+1]; fprintf(stderr, "partial[%d] = %llu * %d\n", i, partial[i+1], variants(notsum[i])); partial[i] += partial[i+2] * variantsTens(notsum+i); fprintf(stderr, "partial[%d] += %llu * %d\n", i, partial[i+2], variantsTens(notsum+i)); } printf("%llu\n", partial[0]); return 0; } |
English