等差数列除以一个数字求和(2019牛客暑期多校训练营(第九场)I题)

??神仙算法,类欧几里得的另一种用法

首先对于一个a为公差,b为首项,n为项数的等差数列,我们以c为除数
我们先考虑首项的贡献,很明显为b/c*n(还用你说 )。
然后对于公差a,我们一共也是计算了(n-1)n次(1到n-1等差数列求和),所以也很明显是
a/c
(n-1)*n。
到这里就完成一半了(根本还没开始

因为是整除,所以接下来我们考虑加起来而导致的溢出情况(a<c,b<c,a+b可不一定小于c)
我们将a和b对c取模再求一次便可以了,取模后所有的答案都是溢出造成的
首先我们考虑和(an+b)/c商一样的数有几个(这个商我们设为x),很明显是((an+b)%c)/a。(从an+b一次减个a,看能减几次商不变)
然后我们再考虑商大于等于x-k的数有几个,同样的算法很容易得到是((a
n+b)%c+kc)/a个。
我们一直算到商大于等于1的就可以得到最后的答案。
((a
n+b)%c)/a ((an+b)%c+kc)/a 仔细看看这两个式子是不是很眼熟。
c为公差 (an+b)%c为首项 a为除数 (an+b)/c为项数,所以开始快乐的 欧几里得算法吧。

代码我贴出来了

/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值