陶陶的难题
2016-03-12 20:01
260 查看
题意
给定A,B,C,L,RA,B,C,L,R,求(∑i=LRi∗⌊A∗i+CB⌋)mod(109+7)(\sum\limits_{i=L}^Ri *\lfloor \frac{A*i + C}{B}\rfloor) \bmod (10^9+7)。A,B,C,L,R≤109A,B,C,L,R\le 10^9
分析
F(N,A,B,C)的引入我们先考虑一个简单的题目:求∑i=0N⌊A∗i+CB⌋\sum\limits_{i=0}^N\lfloor \frac{A*i + C}{B}\rfloor。我们令F(N,A,B,C)=∑i=0N⌊A∗i+CB⌋F(N,A,B,C)=\sum\limits_{i=0}^N\lfloor \frac{A*i + C}{B}\rfloor。我们现在要求解FF这个函数。
分情况讨论:
1°,A≥B1°,A\ge B
F(N,A,B,C)=∑i=0N⌊A∗i+CB⌋=∑i=0N⌊(⌊AB⌋∗B+AmodB)∗i+CB⌋=∑i=0Ni∗⌊AB⌋+∑i=0N⌊AmodB∗i+CB⌋=∑i=0Ni∗⌊AB⌋+F(N,AmodB,B,C)F(N,A,B,C)=\sum\limits_{i=0}^N\lfloor \frac{A*i + C}{B}\rfloor=\sum\limits_{i=0}^N\lfloor \frac{(\lfloor\frac{A}{B}\rfloor*B+A \bmod B)*i + C}{B}\rfloor=\sum\limits_{i=0}^Ni*\lfloor \frac{A}{B}\rfloor+\sum\limits_{i=0}^N\lfloor \frac{A \bmod B *i + C}{B}\rfloor=\sum\limits_{i=0}^Ni*\lfloor \frac{A}{B}\rfloor+F(N,A \bmod B,B,C)
2°,A<B2°,A< B
F(N,A,B,C)=∑i=0N⌊A∗i+CB⌋=∑i=0N∑j=0⌊A∗i+CB⌋−1(j<⌊A∗i+CB⌋)=∑j=0⌊A∗N+CB⌋−1∑i=0N(j<⌊A∗i+CB⌋)F(N,A,B,C)=\sum\limits_{i=0}^N\lfloor \frac{A*i + C}{B}\rfloor=\sum\limits_{i=0}^N\sum\limits_{j = 0}^{\lfloor \frac{A*i + C}{B}\rfloor - 1}(j < \lfloor \frac{A*i + C}{B}\rfloor)=\sum\limits_{j = 0}^{\lfloor \frac{A*N + C}{B}\rfloor - 1}\sum\limits_{i=0}^N(j < \lfloor \frac{A*i + C}{B}\rfloor)
我们看看满足括号里的条件的ii的范围。
j<⌊A∗i+CB⌋j <\lfloor\frac{A*i + C}{B}\rfloor
j+1≤A∗i+CBj+1\le \frac{A*i+C}{B}
B∗j+B−CA≤i\frac{B* j + B - C}{A}\le i
⌊B∗j+B−C−1A⌋<i\lfloor\frac{B * j + B - C - 1} {A}\rfloor
我们就得到了ii
的范围
设zj=⌊B∗j+B−C−1A⌋,Max=⌊A∗N+CB⌋−1z_j = \lfloor\frac{B * j + B - C - 1} {A}\rfloor,Max =\lfloor \frac{A*N + C}{B}\rfloor - 1
F(N,A,B,C)=∑j=0Max(N−zj)=N∗(Max+1)−∑j=0Max⌊B∗j+B−C−1A⌋=∑j=0Max(N−zj)=N∗(Max+1)−F(Max,B,A,B−C−1)F(N,A,B,C)=\sum\limits_{j = 0}^{Max}(N - z_j)=N * (Max+1)-\sum\limits_{j=0}^{Max}\lfloor\frac{B * j + B - C - 1} {A}\rfloor=\sum\limits_{j = 0}^{Max}(N - z_j)=N * (Max+1)-F(Max,B,A,B-C-1)递归计算即可。我们发现,每次分子分母交换位置,都会做一次取模运算,类似欧几里得算法,故它的复杂度为logNlogN。
G(N,A,B,C)的引入
我们回到原题。
令G(N,A,B,C)=∑i=0Ni∗⌊A∗i+CB⌋G(N,A,B,C)=\sum\limits_{i=0}^Ni *\lfloor \frac{A*i + C}{B}\rfloor。类似上面的推理,若A≥BA\ge B,我们可以先取模计算,在此不再赘述如何推。现在我们假设A<BA。
∑i=0Ni∗⌊A∗i+CB⌋=∑i=0Ni∑j=0⌊A∗i+CB⌋−11=∑j=0Max∑i=zj+1Ni\sum\limits_{i=0}^Ni *\lfloor \frac{A*i + C}{B}\rfloor=\sum\limits_{i=0}^Ni \sum\limits_{j=0}^{\lfloor \frac{A*i + C}{B}\rfloor - 1}1=\sum\limits_{j = 0}^{Max}\sum\limits_{i=z_j+1}^Ni其中,Max,zjMax,z_j与之前定义一样。
由等差数列求和公式,我们进一步得到G(N,A,B,C)=12∑j=0Max(N−zj)∗(N+zj+1)=12∑j=0Max(N2+N)−12∑j=0Maxz2j−12∑j=0MaxzjG(N,A,B,C)=\frac{1}{2}\sum\limits_{j = 0}^{Max}(N - z_j) * (N + z_j + 1) =\frac{1}{2}\sum\limits_{j = 0}^{Max}(N ^ 2 + N) - \frac{1}{2}\sum\limits_{j = 0}^{Max}z_j^2 - \frac{1}{2}\sum\limits_{j = 0}^{Max}z_j
现在我们要知道如何求∑j=0Maxz2j\sum\limits_{j = 0}^{Max}z_j^2。
T(N,A,B,C)的引入
设T(N,A,B,C)=∑i=0N⌊A∗i+CB⌋2T(N,A,B,C) = \sum\limits_{i = 0}^{N}\lfloor\frac{A*i+C}{B}\rfloor^2。
同样的,我们只考虑A<BA的情况(A≥BA\ge B的情况同样能简单推出式子转化成A<BA的情况)。
令t=⌊A∗i+CB⌋t=\lfloor\frac{A*i+C}{B}\rfloor。我们可以尝试构造一个关于tt的等差数列求和式子推到TT。
令S=∑i=0N∑j=0t−1j=12∑i=0N(t−1)∗t=12∑i=0Nt2−12∑i=0NtS=\sum\limits_{i = 0}^N\sum\limits_{j=0}^{t-1}j = \frac{1}{2}\sum\limits_{i = 0}^N(t-1)*t=\frac{1}{2}\sum\limits_{i = 0}^Nt^2-\frac{1}{2}\sum\limits_{i = 0}^Nt
那么有2S=T(N,A,B,C)−F(N,A,B,C)2S = T(N, A,B,C) -F(N,A,B,C),即T(N,A,B,C)=2∗S+F(N,A,B,C)T(N,A,B,C)=2*S+F(N,A,B,C)
然后我们把SS变下形,S=∑j=0Maxj∗(N−zj)=N∗∑j=0Maxj−∑j=0Maxj∗zjS=\sum\limits_{j=0}^{Max}j*(N-z_j)=N *\sum\limits_{j=0}^{Max}j-\sum\limits_{j=0}^{Max}j*z_j,Max,zjMax,z_j同样是跟以前的定义一样的。我们惊奇地发现,后面那一项不就是一个新的原问题类型的问题吗?我们就能递归处理了!
总结
综上所述,当A<BA时
G(N,A,B,C)=12∗(Max+1)∗(N2+N)−12∗T(Max,B,A,B−C−1)−12∗F(Max,B,A,B−C−1)G(N,A,B,C)=\frac{1}{2}*(Max+1)*(N ^ 2 + N) - \frac{1}{2}*T(Max,B,A,B-C-1) - \frac{1}{2}*F(Max,B,A,B-C-1)
F(N,A,B,C)=N∗(Max+1)−F(Max,B,A,B−C−1)F(N,A,B,C)=N * (Max+1)-F(Max,B,A,B-C-1)
T(N,A,B,C)=N∗(Max+1)∗Max−2∗G(Max,B,A,B−C−1)+F(N,A,B,C)T(N,A,B,C)=N *(Max+1) * Max-2*G(Max,B,A,B-C-1)+F(N,A,B,C)
其中,Max=⌊A∗N+CB⌋−1Max=\lfloor \frac{A*N + C}{B}\rfloor - 1
因为每一层(N,A,B,CN,A,B,C一定)要求F、G、TF、G、T时用到的Max,zjMax,z_j是一样的,我们就可以同时递归处理F、G、TF、G、T值,这样总的时间复杂度是logNlogN的,就能很好地通过本题。
相关文章推荐
- 奇异值
- Bzoj 2453: 维护队列 && Bzoj 2120: 数颜色 分块,bitset
- 目前流行的源程序版本管理软件和项目管理软件都有哪些?各有什么优缺点?
- OpenCV近期版本对VS的支持情况
- ANDROID音频系统散记
- 《Linux内核设计与实现》与《Linux内核源代码情景分析》读书笔记
- HTTP1.0和HTTP1.1的区别
- yield用法以及IEnumerable转数组
- Python 正整数任意进制互转换代码示例
- 单例模式及常见写法分析(设计模式01)
- java入门学习(15)—多线程
- 蓝桥杯 历届试题 调和级数
- java判断“==”和equals的区别
- 人工智能——神经网络算法初体验 【精华】
- 单例模式及常见写法分析(设计模式01)
- android:clipChildren属性
- 浅谈神经网络
- NSThread
- 打印图形e
- cocos2dx3.X项目重写(七)观察者模式以及schedule引起的bug