题目大意:
正常的加法进位:1+9=10,99+1=100
alice的加法进位1+9=100,99+1=190
正常进位会把进位的数加在前面一位,alice会把数加在前面两位
现在给一个数n,要求你找到有多少不同的数对以alice的加法相加时,结果为n
可以注意到,正常的加法是将奇数位进位到偶数,偶数位进位到奇数位
但alice的加法是奇数位进位到奇数位,偶数位进位到偶数位
也就是说,偶数位与奇数位是互不影响的
所以可以把一个数按奇偶数位进行拆分,分别计算拆分出的两个数有多少个组合方式,一个k的组合方式有(0,k)(1,k-1)(2,k-2)……(k,0)
一共有k种组合方式
但同时也有不合法的情况,就是这两个数字对应总和中的第一个和第二个数字是0
例如(0,1)与(0,22) \ (1,0)与(22,0)
对应过来a=0000,b=2021\a=2021,b=0
由于题目要求a,b要大于0,所以不合法
要减去两个特殊情况
公式就是(x+1)*(y+1)-2
#include <bits/stdc++.h>
#define int long long
using namespace std;
int f[110];
int si(string s) {
int l = s.size();
int res = 0;
for (int i = 0; i < l ; i++) {
res += (int)s[i] - '0';
if (i == l - 1)
break;
res *= 10;
}
return res;
}
void solve() {
string s;
cin >> s;
int l = s.size();
string s1, s2;
for (int i = 0; i < l; i++) {
if (i % 2 == 1) {
s1 += s[i];
} else {
s2 += s[i];
}
}
int a = si(s1);
int b = si(s2);
cout << (a + 1)*(b + 1) - 2 << endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while (t--) {
solve();
}
}