类欧几里得一般形式

 

什么是类欧几里得

类欧几里得可以用两种方式描述:

①求出以下黄色部分中整点个数(整点可以在两条直线方程上,在x轴上不算)

②给出a,b,c,n,求出f(a, b, c, n),其中

\small f(a,b,c,n)=\sum_{i=0}^{n}\left \lfloor \frac{ai+b}{c} \right \rfloor

 

 

类欧几里得的一般形式

形式①(标准类欧几里得):

\small f(a,b,c,n)=\sum_{i=0}^{n}\left \lfloor \frac{ai+b}{c} \right \rfloor(其中a, c为整数)

当b≥c时,相当于上面图片中黄色的三角形下面多出一块包含整点的小矩形

很容易推出\small f(a,b,c,n)=f(a,b\%c,c,n)+(n+1)\left \lfloor \frac{b}{c} \right \rfloor

当a≥c时,相当于图片中黄色的三角形斜边斜率>1,这个时候可以找到最大的正整数k满足k≤a/c,然后先计算在黄色阴影中y=kx+b这条直线下面整点的个数,再计算在黄色部分中剩下部分的整点个数,可以推出

\small f(a,b,c,n)=f(a\%c,b,c,n)+\frac{n(1+n)}{2}\left \lfloor \frac{a}{c} \right \rfloor,对应变换如下图2:

当a<c且b<c时,也就是上面图2中最右边的那种情况

可以发现,这个三角形可以通过改变两条直角边来变成上面两种情况,为了更好的理解,这里就不秀公式了,直接上图

对于图3,其中\small m=\left \lfloor \tfrac{an+b}{c} \right \rfloor,转换之后原先的斜率a/c变成相反数c/a,可以得出

\small f(a,b,c,n)=nm-p,其中p为左图红点个数(别忘了x轴上整点不算,所以上面会多一排红点)

而左图的红点刚好构成了另外一个斜率>1的直角三角形,将它转正成右图,这样就可以得到递推式

\small f(a,b,c,n)=nm-f(c,c-b-1,a,m-1)搞定,其中c和a交换因为斜率正好变为相反数,b变为c-b-1是为了保证三角形在没翻转之前和原三角形斜边中间不会有多余的点,且不和斜边相重合

公式递推:

\small f(a,b,c,n)=\sum_{x=0}^{n}\sum_{y=1}^{m}\left [ y\leq \left \lfloor \frac{ax+b}{c} \right \rfloor \right ]=f(a,b,c,n)=\sum_{x=0}^{n}\sum_{y=0}^{m-1}\left [ y+1\leq \left \lfloor \frac{ax+b}{c} \right \rfloor \right ]

\small =\sum_{x=0}^{n}\sum_{y=0}^{m-1}\left [ yc+c-b\leq ax \right ]=\sum_{x=0}^{n}\sum_{y=0}^{m-1}\left [ \frac{yc+c-b-1}{a}< x \right ]

\small =\sum_{y=0}^{m-1}(n-\left \lfloor \frac{yc+c-b-1}{a} \right \rfloor)=nm-f(c,c-b-1,a,m-1)

总体当a=0或n=0或n=1时递推结束,总复杂度O(log)级别

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值