arc075f

题目大意

定义rev(n)为n翻转后的那个数,比如123变成321
现在给出一个d(d<=1e9),求n+d=rev(n)的数的个数

题解

一个关键的问题是n似乎是可以无限大的,所以肯定要先确定一个n的上界

观察原式:
nrev(n)=d n − r e v ( n ) = d
设其位数为s,n的第i位为p[i](第一位是个位)
那么原式等于
s1i=0(p[i]p[s1i])10i ∑ i = 0 s − 1 ( p [ i ] − p [ s − 1 − i ] ) ∗ 10 i
合并一下
s/21i=0(p[i]p[s1i])(10i10si1) ∑ 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的情况)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值