【luogu P6860】象棋与马(数学)(杜教筛)
象棋与马
题目链接:luogu P6860
题目大意
给你一个数 n,然后问你有多少个 a<=n,b<=n 满足在一个二维网格上从源点出发每次走一个 a*b 的矩阵,能走到图上的所有整点。
思路
首先考虑怎样的点对是满足条件的。
首先我们考虑如果它能从 走到 ,那它就能走到所有点。(因为你可以一步一步走)
那接着考虑怎么搞,首先顺序无关,所以我们可以把它分成两段位移: 和 。
然后第一段的整体位移可以表示成 或者 ,第二段就是 或 。
考虑列出四种可能的方法:
然后解四个方程,第一是 ,由于 互质,所以 会可以是任意整数(设为 下同):
,无解
第二个是跟上面差不多,就是 ,那就是 是偶数, 是奇数。
第三个就是 ,那就是 是偶数, 是奇数。
第四个是 ,那就是无解。
那综上,我们可以总结出合法的情况:
,且 是奇数。
然后考虑如何继续求,那 是奇数, 自然也是。
然后根据辗转相减法: 就有
你考虑设 (到时算出来答案乘 ,因为显然 是不成立)
然后发现如果不看奇偶它就是 ,那你考虑有了右边之后会怎么样。
考虑这个新的值是 。
(原来的式子变成:)
考虑从 的性质考虑,如果 是偶数,那所有偶数跟它都不是互质的,那这个操作就不会影响,所以 。
如果 是奇数,那我们考虑一个东西,就是这个互质的对称性。
什么意思呢,就是如果 互质(),那么 也互质。
那我们就其实可以看做是 ,当然你会发现 要特判掉。(应该是 而不是 )
(其实可以不特判,然后到时答案减 即可,减一是因为后面乘 )
然后你就可以列出
然后把 放进去:
然后放回原来的式子:
那我们再看右边的部分,那只看有值的,就是偶数的。
然后再从递推式求的方式来看 ,如果它是偶数那返回的就是 ,否则就是 ,你会发现它就是 的值。
然后就有:
左边的用杜教筛,右边的递归下去就好了。
复杂度是 ,看似很危,但其实跑不满(每次递归的 越来越小)可以过。
代码
__EOF__

本文链接:https://www.cnblogs.com/Sakura-TJH/p/luogu_P6860.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!