Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- long long dp[20][2][2];
- string s;
- long long solve(int idx = 0, int carry = 0, int needCarry = 0) {
- if (idx * 2 == (int) s.size())
- return needCarry == carry;
- if (s.size() % 2 == 1 && idx == s.size() / 2) {
- int ret = 0;
- for (int i = (idx == 0); i < 10; ++i) {
- if ((i + i + carry) % 10 != s[idx] - '0') {
- continue;
- }
- if (needCarry != (i + i + carry >= 10)) {
- continue;
- }
- ret++;
- }
- return ret;
- }
- long long& ret = dp[idx][carry][needCarry];
- if (~ret)
- return ret;
- ret = 0;
- int p = s[idx] - '0';
- int q = s[s.size() - idx - 1] - '0';
- for (int i = (idx == 0); i < 10; ++i) {
- for (int j = 0; j < 10; ++j) {
- if ((i + j + carry) % 10 != p) {
- continue;
- }
- if (needCarry == (i + j >= 10) && (i + j) % 10 == q) {
- ret += solve(idx + 1, (i + j + carry) > 9, 0);
- }
- if (needCarry == (i + j + 1 >= 10) && (i + j + 1) % 10 == q) {
- ret += solve(idx + 1, (i + j + carry) > 9, 1);
- }
- }
- }
- return ret;
- }
- int main() {
- int T;
- cin >> T;
- while (T--) {
- cin >> s;
- reverse(s.begin(), s.end());
- memset(dp, -1, sizeof(dp));
- long long ans = solve(0, 0, 0);
- if (s.back() == '1') {
- memset(dp, -1, sizeof(dp));
- s.pop_back();
- ans += solve(0, 0, 1);
- }
- printf("%lld\n", ans);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement