#include <bits/stdc++.h> using namespace std; using LL = long long; LL res,inp; LL f (LL x) { if (x > 18) return 0; if (x < 10) return x+1; else return 19-x; } void show (stack <LL> S) { if (S.size() < 2) { if(S.empty() == false) res = f(S.top()); return; } int n = S.size(); LL tab[S.size()][3]; while (S.empty() == false) { tab[n-S.size()][0] = S.top(); S.pop(); } tab[0][2] = 0; tab[0][1] = f(tab[0][0]); for (int i=1; i<n; ++i) { tab[i][1] = (tab[i-1][1] + tab[i-1][2]) * f(tab[i][0]); if (i > 1) tab[i][2] = (tab[i-2][1] + tab[i-2][2]) * f(tab[i-1][0]*10 + tab[i][0]); else tab[i][2] = f(tab[i-1][0]*10 + tab[i][0]); } res = tab[n-1][1] + tab[n-1][2]; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); res = 0; cin >> inp; stack <LL> S; while (inp) { S.push(inp%10); inp /= 10; } show(S); cout << res << "\n"; 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 | #include <bits/stdc++.h> using namespace std; using LL = long long; LL res,inp; LL f (LL x) { if (x > 18) return 0; if (x < 10) return x+1; else return 19-x; } void show (stack <LL> S) { if (S.size() < 2) { if(S.empty() == false) res = f(S.top()); return; } int n = S.size(); LL tab[S.size()][3]; while (S.empty() == false) { tab[n-S.size()][0] = S.top(); S.pop(); } tab[0][2] = 0; tab[0][1] = f(tab[0][0]); for (int i=1; i<n; ++i) { tab[i][1] = (tab[i-1][1] + tab[i-1][2]) * f(tab[i][0]); if (i > 1) tab[i][2] = (tab[i-2][1] + tab[i-2][2]) * f(tab[i-1][0]*10 + tab[i][0]); else tab[i][2] = f(tab[i-1][0]*10 + tab[i][0]); } res = tab[n-1][1] + tab[n-1][2]; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); res = 0; cin >> inp; stack <LL> S; while (inp) { S.push(inp%10); inp /= 10; } show(S); cout << res << "\n"; return 0; } |