[关闭]
@ZYK1997 2015-03-31T20:47:32.000000Z 字数 2386 阅读 837

经典题目

给你 a,b,c,n,求

i=1nax+bc

方法:辗转相除法

推导如下:

x=1nax+bc

=x=1nk=1[kax+bc]

=k=1x=1n[kax+bc]

注:[ ]表达式可视为布尔表达式,当括号内返回值为“真”时,表达式值为1,否则表达式的值为0。

下面化简 kax+bcckbaxxckba

xckb+a1a

=k=1kmax=an+bcx=1n[xkcb+a1a]

=k=1kmax(n+1kcb+a1a)

=kmax(n+1)k=1kmaxckb+a1a

观察算式,前面 kmax(n+1)可以O(1)算出来,而后面的kmaxk=1ckb+a1a则转化为了原问题nx=1ax+bc的子问题。
在这里有一个优化:
x=1nax+bc

=x=1n(a mod c+acc)x+b mod c+bccc

=x=1na mod cx+b mod cc+acx+bc

=x=1na mod cx+b mod cc+x=1n(acx+bc)

x=1na mod cx+b mod cc+acn(n+1)2+bcn

现在,我们使得 a,bc,再用我们上面推得的公式,问题转化为它的子问题kmaxk=1ckb+a1a,相当于 a,c交换位置,继续取模变小。这样一来我们每次交换、取模,直到 n0,相当于进行了一次 Gcd(a,c),所以复杂度是O(log2N)。问题得到完美解决。

总结:

从这道题中我们可以得到以下经验:
1. 当遇到一些问题时,我们可以将它转化为含有布尔表达式的算式,不要觉得布尔表达式难以解决,当我们以后使用莫比乌斯函数μ(x)可以方便的解决含有布尔表达式的算式
2. 注意向上取整 与向下取整 之间的互相转换:x=x,x=x,ab=a+b1b
3. 要灵活掌握整除与取模的关系转换:a mod b=aabb
4. 要拥有将现有问题转化为同类型子问题的能力,从而迭代计算
5. 公式推导能力很重要,不然一切都是扯淡,233。。。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注