题目大意
定义rev(n)为n翻转后的那个数,比如123变成321
现在给出一个d(d<=1e9),求n+d=rev(n)的数的个数
题解
一个关键的问题是n似乎是可以无限大的,所以肯定要先确定一个n的上界
观察原式:
n−rev(n)=d
n
−
r
e
v
(
n
)
=
d
设其位数为s,n的第i位为p[i](第一位是个位)
那么原式等于
∑s−1i=0(p[i]−p[s−1−i])∗10i
∑
i
=
0
s
−
1
(
p
[
i
]
−
p
[
s
−
1
−
i
]
)
∗
10
i
合并一下
∑s/2−1i=0(p[i]−p[s−1−i])∗(10i−10s−i−1)
∑
i
=
0
s
/
2
−
1
(
p
[
i
]
−
p
[
s
−
1
−
i
]
)
∗
(
10
i
−
10
s
−
i
−
1
)
那么s最多就是d*2
这样我们就确定了n的位数的上界
因为很小所以我们可以直接枚举
设t[i]=p[i]-p[s-1-i]
可以发现如果确定了t就可以轻松的计算出p的方案数(可是我被坑了好久)
所以考虑枚举出每一种t的情况
直接枚举显然是不可以的,但是有很多情况是可以剪枝的
我们不妨从高位开始确定,比如现在确定了前3位
123xxxxx
d为1236xxxx
那么我们的第四位其实只能取6,7(每一个位置系数界是[-9,9],7的话后面可以减回来)
那么每一个t就只有两种取值了
因为一开始没有想清楚,又调试不了,搞了好久
两个错的地方:
1:位数是奇数,中间那一位可以随便取,所以*10
2:n的最前面那一位是不能取0的,所以当t[1]>0时要减一(这时有一种s[1]=0的情况)