#include <bits/stdc++.h> using namespace std; #define FOR(i, l, r) for(int i = (l); i <= (r); ++i) #define REP(i, n) FOR(i, 0, (n) - 1) using LL = long long; template<class T> int size(T &&x) { return int(x.size()); } template<class A, class B> ostream& operator<<(ostream &os, const pair<A, B> &p) { return os << '(' << p.first << ", " << p.second << ')'; } template<class T> auto operator<<(ostream &out, T &&x) -> decltype(x.begin(), out) { out << '('; for(auto it = x.begin(); it != x.end(); ++it) out << *it << (it == prev(x.end()) ? "" : ", "); return out << ")"; } void dump() {} template<class T, class... Args> void dump(T &&x, Args... args) { cerr << x << "; "; dump(args...); } struct Nl{~Nl(){cerr << '\n';}}; #ifdef DEBUG #define debug(x...) cerr << (strcmp(#x, "") ? #x ": " : ""), dump(x), Nl(), cerr << "" #else #define debug(...) 0 && cerr #endif mt19937_64 rng(0); int rd(int l, int r) { return uniform_int_distribution<int>(l, r)(rng); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); string str; cin >> str; int n = size(str); vector<LL> dp(n + 1); dp[0] = 1; auto get = [&](int i) { return str[i - 1] - '0'; }; FOR(i, 1, n) { dp[i] = dp[i - 1] * (get(i) + 1); if(i != 1) { int x = get(i - 1) * 10 + get(i); if(x < 10 || 18 < x) continue; dp[i] += dp[i - 2] * (19 - x); } } cout << dp[n] << "\n"; }
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 | #include <bits/stdc++.h> using namespace std; #define FOR(i, l, r) for(int i = (l); i <= (r); ++i) #define REP(i, n) FOR(i, 0, (n) - 1) using LL = long long; template<class T> int size(T &&x) { return int(x.size()); } template<class A, class B> ostream& operator<<(ostream &os, const pair<A, B> &p) { return os << '(' << p.first << ", " << p.second << ')'; } template<class T> auto operator<<(ostream &out, T &&x) -> decltype(x.begin(), out) { out << '('; for(auto it = x.begin(); it != x.end(); ++it) out << *it << (it == prev(x.end()) ? "" : ", "); return out << ")"; } void dump() {} template<class T, class... Args> void dump(T &&x, Args... args) { cerr << x << "; "; dump(args...); } struct Nl{~Nl(){cerr << '\n';}}; #ifdef DEBUG #define debug(x...) cerr << (strcmp(#x, "") ? #x ": " : ""), dump(x), Nl(), cerr << "" #else #define debug(...) 0 && cerr #endif mt19937_64 rng(0); int rd(int l, int r) { return uniform_int_distribution<int>(l, r)(rng); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); string str; cin >> str; int n = size(str); vector<LL> dp(n + 1); dp[0] = 1; auto get = [&](int i) { return str[i - 1] - '0'; }; FOR(i, 1, n) { dp[i] = dp[i - 1] * (get(i) + 1); if(i != 1) { int x = get(i - 1) * 10 + get(i); if(x < 10 || 18 < x) continue; dp[i] += dp[i - 2] * (19 - x); } } cout << dp[n] << "\n"; } |