Advertisement
Guest User

Untitled

a guest
Sep 19th, 2019
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.30 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. long long dp[20][2][2];
  5. string s;
  6.  
  7. long long solve(int idx = 0, int carry = 0, int needCarry = 0) {
  8. if (idx * 2 == (int) s.size())
  9. return needCarry == carry;
  10.  
  11. if (s.size() % 2 == 1 && idx == s.size() / 2) {
  12. int ret = 0;
  13. for (int i = (idx == 0); i < 10; ++i) {
  14. if ((i + i + carry) % 10 != s[idx] - '0') {
  15. continue;
  16. }
  17. if (needCarry != (i + i + carry >= 10)) {
  18. continue;
  19. }
  20. ret++;
  21. }
  22. return ret;
  23. }
  24.  
  25. long long& ret = dp[idx][carry][needCarry];
  26.  
  27. if (~ret)
  28. return ret;
  29.  
  30. ret = 0;
  31.  
  32. int p = s[idx] - '0';
  33. int q = s[s.size() - idx - 1] - '0';
  34.  
  35. for (int i = (idx == 0); i < 10; ++i) {
  36. for (int j = 0; j < 10; ++j) {
  37. if ((i + j + carry) % 10 != p) {
  38. continue;
  39. }
  40.  
  41. if (needCarry == (i + j >= 10) && (i + j) % 10 == q) {
  42. ret += solve(idx + 1, (i + j + carry) > 9, 0);
  43. }
  44.  
  45. if (needCarry == (i + j + 1 >= 10) && (i + j + 1) % 10 == q) {
  46. ret += solve(idx + 1, (i + j + carry) > 9, 1);
  47. }
  48. }
  49. }
  50.  
  51. return ret;
  52. }
  53.  
  54. int main() {
  55. int T;
  56. cin >> T;
  57.  
  58. while (T--) {
  59. cin >> s;
  60. reverse(s.begin(), s.end());
  61. memset(dp, -1, sizeof(dp));
  62.  
  63. long long ans = solve(0, 0, 0);
  64.  
  65. if (s.back() == '1') {
  66. memset(dp, -1, sizeof(dp));
  67. s.pop_back();
  68. ans += solve(0, 0, 1);
  69. }
  70.  
  71. printf("%lld\n", ans);
  72. }
  73.  
  74. return 0;
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement