什么是类欧几里得
类欧几里得可以用两种方式描述:
①求出以下黄色部分中整点个数(整点可以在两条直线方程上,在x轴上不算)
②给出a,b,c,n,求出f(a, b, c, n),其中
类欧几里得的一般形式
形式①(标准类欧几里得):
(其中a, c为整数)
当b≥c时,相当于上面图片中黄色的三角形下面多出一块包含整点的小矩形
很容易推出
当a≥c时,相当于图片中黄色的三角形斜边斜率>1,这个时候可以找到最大的正整数k满足k≤a/c,然后先计算在黄色阴影中y=kx+b这条直线下面整点的个数,再计算在黄色部分中剩下部分的整点个数,可以推出
,对应变换如下图2:
当a<c且b<c时,也就是上面图2中最右边的那种情况
可以发现,这个三角形可以通过改变两条直角边来变成上面两种情况,为了更好的理解,这里就不秀公式了,直接上图
对于图3,其中,转换之后原先的斜率a/c变成相反数c/a,可以得出
,其中p为左图红点个数(别忘了x轴上整点不算,所以上面会多一排红点)
而左图的红点刚好构成了另外一个斜率>1的直角三角形,将它转正成右图,这样就可以得到递推式
搞定,其中c和a交换因为斜率正好变为相反数,b变为c-b-1是为了保证三角形在没翻转之前和原三角形斜边中间不会有多余的点,且不和斜边相重合
公式递推:
总体当a=0或n=0或n=1时递推结束,总复杂度O(log)级别