题目
问题描述
定义一种特殊加法计算:
上式为正常加法计算,下式为特殊加法计算,特殊之处在于进位将会跳跃一位相加, 比如应该进位到十位的1进位到了百位,应该进位到百位的1进位到了千位。
给定测试总数
t
t
t,每个测试包含一个数
n
n
n,
n
n
n是由特殊加法计算所得出的结果,问有多少对
(
a
,
b
)
(a,b)
(a,b)可使得
a
+
b
=
n
a\ +\ b=n
a + b=n,注意
(
a
,
b
)
与
(
b
,
a
)
(a,b)与(b,a)
(a,b)与(b,a)在
a
≠
b
a\neq b
a=b时视作不同,当
a
=
b
a=b
a=b时视作相同。
要求
a
,
b
a,b
a,b均为正整数。
例:当
n
=
12
n=12
n=12时,有4种情况,分别为:
1.a=11,b=1;
2.a=1,b=11;
3.a=10,b=2;
4.a=2,b=10;
分析
特殊计算的特点是进位都只会隔位相加,也就是说只有相隔的列之间才会有影响,若两个列相邻,则不会有影响。
不妨将相隔的列都取出来,组成一个新的数,以2021作为样例,可从中分出两个数分别是1和22,
满足
a
+
b
=
1
a+b=1
a+b=1的
(
a
,
b
)
(a,b)
(a,b)对有
(
0
,
1
)
,
(
1
,
0
)
(0,1),(1,0)
(0,1),(1,0),共2对;
满足
a
+
b
=
22
a+b=22
a+b=22的
(
a
,
b
)
(a,b)
(a,b)对有
(
0
,
22
)
,
(
1
,
21
)
…
…
,
(0,22),(1,21)……,
(0,22),(1,21)……,共有23对。
两两匹配就可以得到满足条件的
a
,
b
a,b
a,b,比如
(
0
,
1
)
与
(
2
,
20
)
(0,1)与(2,20)
(0,1)与(2,20)
可以得到
a
=
0020
,
b
=
2001
a=0020,b=2001
a=0020,b=2001,结果为2021.
以此类推。
不过存在两个特例:
1.
(
0
,
1
)
与
(
0
,
22
)
(0,1)与(0,22)
(0,1)与(0,22)
对应
a
=
0000
,
b
=
2021
a=0000,b=2021
a=0000,b=2021
2.
(
1
,
0
)
与
(
22
,
0
)
(1,0)与(22,0)
(1,0)与(22,0)
对应
a
=
2021
,
b
=
0000
a=2021,b=0000
a=2021,b=0000
对于题目来说,不考虑这种存在0的情况。
所以最终的结果为 2 ∗ 23 − 2 = 44 2*23-2=44 2∗23−2=44
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t;
string S;
int main(){
while(cin>>t){
while(t--){
cin>>S;
ll c=0,d=0;
for(int i=0;i<S.size();i++){
if(i%2){
c*=10;
c+=S[i]-'0';
}
else{
d*=10;
d+=S[i]-'0';
}
}
cout<<(c+1)*(d+1)-2<<endl;
}
}
return 0;
}