NOIP2015普及组第3题——sum

1. 原题

2. 解题思路

枚举所有的 x、z 再判断是否符合条件并求和,是大部分人都能想到的做法,不过只能拿到 40 分。其实这样的枚举方式是有优化余地的,题目要求的 x 和 z 必须是奇偶性相同的,否则不存在正整数 y 满足题意。另外 x 和 z 的颜色需要相同,因此只有奇偶性相同、颜色也相同的格子两两之间才会产生分数。

但这样还是不够快速,计算分数时其实不需要逐一枚举求和。( x + z ) · ( number_x + number_z ) = x · number_x + z · number_z + x · number_z + z · number_x,其中 x · number_x 只依赖于 x,可以预处理其累计和(d [ 颜色 ] [ 奇偶性 ])。假设同一种颜色、奇偶性的格子一共有 s 个(可以预处理计算),那么每个 x · number_x 都在分数和中出现了 ( s - 1 ) 次,即和其他的 s - 1 个格子作为 x 和 z 配对产生的和(x < z,任何 2 个格子只可能产生 1 次和)。

z · number_x 对于同一个 x 来说,其和为 number_x · ( sum ( 编号 ) - x ),先将其补上一个 number_x · x。那么此时这部分和为 sum ( number ) · sum ( 编号 ),sum ( number ) 和 sum ( 编号 ) 都是可以预处理的。需要减去的 number_x · x 算在之前的 ( s - 1 ) · sum ( number_x · x ),于是变为 ( s - 2 ) · sum ( number_x · x )。

不过似乎少了 x · number_z,其实也被算在了 number_z · ( sum ( 编号 ) - z ) 中了,最后不要忘记开 long long 和取模哦。整个程序的时间复杂度是 O ( n + m ),可以接受的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值