思路:
将给出的两个数组按照余数放入$[0,p-1]$的”桶”中, 如图所示, 其中ma和mc分别代表a%p, c%p.
这样, 从ma开始,后面(b-a+1)%p个桶中有$\lfloor \frac{b-a+1}{p} \rfloor + 1$个数, 其他的桶中有$\lfloor \frac{b-a+1}{p} \rfloor$.
以$[a,b]$划分的桶作为”基准”, 从ma开始, 可以计算得与其对应的符合$(x+y) \equiv m (mod\ p)$的位置为m-a所在的桶, 即为桶(mc+m-a)%p
得到了起始位置后便可以通过循环来计算符合条件的数字对的数量. 即第一个堆往后遍历, 第二个堆往前遍历.
然而$10^{9}$的数据量直接循环可能会超时, 可以将”桶”分为几个区间, 用区间的分界点来界定需要增加的量.
剩下的操作便是繁琐的细节问题了.
代码:
1 |
|