bzoj 3817: Sum 类欧几里得算法

该博客详细介绍了如何使用类欧几里得算法来解决bzoj 3817题目,讨论了通过数形结合的方法将问题转化为线性方程,并通过计算线段与x正半轴之间区域的整点个数来求解。最终实现了O(logN)的时间复杂度解决方案,并提供了AC代码。
摘要由CSDN通过智能技术生成

       这道题目solution写了两种做法,都讲一下吧。

       首先,令x=r^0.5,显然,如果x>2,则可以不断减2到小于二;如果x>1,那么变为2-x。因此此时必有x<1。(特判r为完全平方数的情况)。那么令y=1/x,则:

       题目等价于在数轴从0~n,以y长度为一个区间(左闭右开)黑白交替染色,求黑色部分覆盖的整点减去白色部分覆盖的整点。然后把最后面零散的部分暴力计算,如果最后一个是黑色的也暴力计算。那么这个时候黑白段数相等,且每一段黑(白)都至少覆盖[y]个点恰好各自抵消[y],那么将每一段都去掉[y]的长度,则n’={y}/y*n,y'={y}继续计算。显然y>1则y>1+{y}>2{y},因此为logN。

       另一种为类欧几里得算法。感觉这一种比较有用就用了这一种,如下:

       欧几里得算法:计算gcd(x,y),可以由gcd(y,x%y)得到。类欧几里得算法同理。

      令x=r^0.5, 显然,(-1)^[d*x]为=1+2*(2[d*x/2]-[d*x]),那么相当于求:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值