辗转相除的思想与运用:
先来道比较水的题目:(spoj 3899)
题目的大意是:给出a,b,x,y,求出最小的q使得 a/b < p/q < x/y,若有多解则求p最小的。
咋一眼看上去没有什么思路。
其实我们可以注意到:y/x < q/p < b/a,也就是说,我们取倒数的话对不等式没有什么影响。
那么我们设[a/b] = k,我们对于每个分数都减去k
我们得出来a',p',x',取倒数后递归解决y/x' < q/p' < b/a'
最后假如当前的a/b < 1,x/y > 1,那么q直接取1就好了。
求出p'之后,q = [p'y/x'] + 1
然后一道没这么水的(我觉得而已-_-) (spoj 4717)
题目其实就是给出n,a,b,C,求出sigma(x=0->n)[(ax+C)/b]
是不是觉得很水
我们可以进行一些变形
当a<b时,
设Y = [ax/b + C],则原式=(sigma(x=0->n)sigma(y=0->Y-1)(y<Y));
交换x,y的位置,原式=(sigma(y=0->Y-1)sigma(x=0->n)(y<Y)
观察当y<Y,时,y < [ax/b + C] -> y + 1 <= [ax/b + C],y + 1 - C <= [ax/b],(y+1-C)*b < [ax]
[(y+1-C)*b-1) / a] < x.
原式=sigma(y=0->Y-1)(n - [((y+1-C)*b-1)/a])
我们成功地将a,b互换了位置!!!然后我们就可以递归求解。
当a>= b时,
原式=sigma(x=0->n)([a/b]x) + sigma(x=0->n)([c/b])+sigma(x=0->n)([((a%b)x+c%b)/b]);
我们继续递归求sigma(x=0->n)([((a%b)x+c%b)/b])
问题就完美解决了。。。