【JZOJ5439】 Calculate

2 篇文章 0 订阅
1 篇文章 0 订阅

题目简述

n100000,m10000,k109 n ≤ 100000 , m ≤ 10000 , k ≤ 10 9

Bi109,Ai500 B i ≤ 10 9 , A i ≤ 500

思路

看到式子果断拆

有这样一个式子: abc=acbc(a%c<b%c) ⌊ a − b c ⌋ = ⌊ a c ⌋ − ⌊ b c ⌋ − ( a % c < b % c )

那怎样证明呢?

a=k1c+d1(0d1<c),b=k2c+d2(0d2<c) a = k 1 c + d 1 ( 0 ≤ d 1 < c ) , b = k 2 c + d 2 ( 0 ≤ d 2 < c )

ab=k1c+d1k2cd2=(k1k2)c+d1d2 a − b = k 1 c + d 1 − k 2 c − d 2 = ( k 1 − k 2 ) c + d 1 − d 2

所以 abc=c+d1d2c ⌊ a − b c ⌋ = c + ⌊ d 1 − d 2 c ⌋

c<d1d2<c − c < d 1 − d 2 < c

d1d2c=(d1<d2) ⌊ d 1 − d 2 c ⌋ = − ( d 1 < d 2 )

所以 abc=acbc(a%c<b%c) ⌊ a − b c ⌋ = ⌊ a c ⌋ − ⌊ b c ⌋ − ( a % c < b % c )

所以 TBiAi=TAiBiAi(T%Ai<Bi%Ai) ⌊ T − B i A i ⌋ = ⌊ T A i ⌋ − ⌊ B i A i ⌋ − ( T % A i < B i % A i )

对于每个询问,二分 T T

记录每个Ai的值的个数

对于每个 Ai A i 记录 Bi%Ai B i % A i 的个数

分成三个部分分别求值即可

总结

  • 式子要拆
  • 求临界点要二分
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值