【HNOI2016】大数

题意

给一个 N 位的可能有前导0的数 S 及一个素数P M 个询问,每个询问求S的一个字串中有多少子串是 P 的倍数(0也是 P 的倍数)。
N,M105 P<1010

解法

     对于询问 [l,r] ,我们要求的相当于

i=lrj=ir[(k=ijs[k]10jk)modP=0]

=i=lrj=ir[(10jk=ijs[k]10k)modP=0]

     因为题目保证了 P 为质数,所以当P2 P5 时, 10k 存在逆元,且 10jmodP0 。设 a[i]=s[i](10i)1modPsum[i] a[i] P 下前缀和。
原式=i=lrj=ir[(k=ija[k])modP=0]
     =i=lrj=ir[(sum[j]sum[i1])modP=0]
     =i=lrj=ir[(sum[j]=sum[i1])]
对于多组询问,这就是一个经典的莫队了。将 sum 数组离散化,开一个桶记录一下 sum[i] 这个数值已经出现了多少次,移动左右端点时更新一下就行了。
     而当 P=2 P=5 时,答案比较好推,这里就不赘述了。
     注意可能爆 long long

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值