#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
string addBigInt(string num1, string num2) {
string result = "";
int i = num1.length() - 1;
int j = num2.length() - 1;
int carry = 0;
while (i >= 0 || j >= 0 || carry) {
int sum = carry;
if (i >= 0) sum += num1[i--] - '0';
if (j >= 0) sum += num2[j--] - '0';
carry = sum / 10;
result += to_string(sum % 10);
}
reverse(result.begin(), result.end());
return result;
}
int main() {
string S;
if (!(cin >> S)) {
cout << 0 << endl;
return 0;
}
int n = S.length();
if (n == 0 || S[0] == '0') {
cout << 0 << endl;
return 0;
}
vector<string> dp(n + 1, "0");
dp[0] = "1";
dp[1] = "1";
for (int i = 2; i <= n; i++) {
if (S[i - 1] != '0') {
dp[i] = addBigInt(dp[i], dp[i - 1]);
}
int doubleDigit = (S[i - 2] - '0') * 10 + (S[i - 1] - '0');
if (doubleDigit >= 10 && doubleDigit <= 26) {
dp[i] = addBigInt(dp[i], dp[i - 2]);
}
if (dp[i] == "0") {
cout << 0 << endl;
return 0;
}
}
cout << dp[n] << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cmluZyBhZGRCaWdJbnQoc3RyaW5nIG51bTEsIHN0cmluZyBudW0yKSB7CiAgICBzdHJpbmcgcmVzdWx0ID0gIiI7CiAgICBpbnQgaSA9IG51bTEubGVuZ3RoKCkgLSAxOwogICAgaW50IGogPSBudW0yLmxlbmd0aCgpIC0gMTsKICAgIGludCBjYXJyeSA9IDA7CgogICAgd2hpbGUgKGkgPj0gMCB8fCBqID49IDAgfHwgY2FycnkpIHsKICAgICAgICBpbnQgc3VtID0gY2Fycnk7CiAgICAgICAgaWYgKGkgPj0gMCkgc3VtICs9IG51bTFbaS0tXSAtICcwJzsKICAgICAgICBpZiAoaiA+PSAwKSBzdW0gKz0gbnVtMltqLS1dIC0gJzAnOwogICAgICAgIGNhcnJ5ID0gc3VtIC8gMTA7CiAgICAgICAgcmVzdWx0ICs9IHRvX3N0cmluZyhzdW0gJSAxMCk7CiAgICB9CiAgICByZXZlcnNlKHJlc3VsdC5iZWdpbigpLCByZXN1bHQuZW5kKCkpOwogICAgcmV0dXJuIHJlc3VsdDsKfQoKaW50IG1haW4oKSB7CiAgICBzdHJpbmcgUzsKICAgIGlmICghKGNpbiA+PiBTKSkgewogICAgICAgIGNvdXQgPDwgMCA8PCBlbmRsOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGludCBuID0gUy5sZW5ndGgoKTsKICAgIAogICAgaWYgKG4gPT0gMCB8fCBTWzBdID09ICcwJykgewogICAgICAgIGNvdXQgPDwgMCA8PCBlbmRsOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIHZlY3RvcjxzdHJpbmc+IGRwKG4gKyAxLCAiMCIpOwogICAgCiAgICBkcFswXSA9ICIxIjsKICAgIGRwWzFdID0gIjEiOwoKICAgIGZvciAoaW50IGkgPSAyOyBpIDw9IG47IGkrKykgewogICAgICAgIGlmIChTW2kgLSAxXSAhPSAnMCcpIHsKICAgICAgICAgICAgZHBbaV0gPSBhZGRCaWdJbnQoZHBbaV0sIGRwW2kgLSAxXSk7CiAgICAgICAgfQoKICAgICAgICBpbnQgZG91YmxlRGlnaXQgPSAoU1tpIC0gMl0gLSAnMCcpICogMTAgKyAoU1tpIC0gMV0gLSAnMCcpOwogICAgICAgIGlmIChkb3VibGVEaWdpdCA+PSAxMCAmJiBkb3VibGVEaWdpdCA8PSAyNikgewogICAgICAgICAgICBkcFtpXSA9IGFkZEJpZ0ludChkcFtpXSwgZHBbaSAtIDJdKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKGRwW2ldID09ICIwIikgewogICAgICAgICAgICBjb3V0IDw8IDAgPDwgZW5kbDsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGNvdXQgPDwgZHBbbl0gPDwgZW5kbDsKCiAgICByZXR1cm4gMDsKfQ==