题意:
洛谷链接
输入n,m ,求 n∑i=1m∑j=1(n%i)(m%j),i≠j。答案对 19940417 取模。
看到了这道题,觉得可做,拿来充博客防止咕咕咕。
开始还在想 19940417 是什么生日,结果网上搜不着,估计是出题人的生日?
然而这数字还不是个质数,我谔谔毒瘤出题人!
言归正传
由于 (n%i) 与 (m%j) 互不影响,可以单独拿出来。变为:
Ans=n∑i=1(n%i)m∑j=1(m%j)
取模不好算,转化一下就能用整除分块了:n%i=n−⌊ni⌋∗i
Ans=n∑i=1(n−⌊ni⌋∗i)m∑j=1(m−⌊mj⌋∗j)
Ans=(n2−n∑i=1⌊ni⌋∗i)(m2−m∑j=1⌊mj⌋∗j)
测一发没过样例?然后一看漏了个条件:i≠j, 呵~
那么把 i=j 的减去就可了。(默认 n 小于 m)
Jian=n∑i=1(n−⌊ni⌋∗i)×(m−⌊mi⌋∗i)
Jian=n∑i=1n∗m−n∗⌊mi⌋∗i−m∗⌊ni⌋∗i+⌊ni⌋⌊mi⌋∗i2
Jian=n∗n∗m−n∗n∑i=1⌊mi⌋∗i−m∗n∑i=1⌊ni⌋∗i+n∑i=1⌊ni⌋⌊mi⌋∗i2
前三项好办,最后一项有个 i2 的前缀和,它等于 n∗(n+1)∗(2n+1)6,然后你惊奇地发现它上面爆long long了,没法直接算,于是还得算出 6 的逆元。
用费小结果又过不了样例了,后来一想这个毒瘤出题人模数竟然不是质数,只好打个exgcd上去。算出来6的逆元其实直接用就行了,没必要在代码里算。
感觉很长很难写?其实发现整除分块的式子都是出现好多次的,记录下答案能缩短码量。
我的奇异码风加上鬼畜的取模使得代码很不可读,但其实短的令人舒服~
还有注意一个细节就是计算 n∑i=1⌊mi⌋∗i 的时候分块右边界 r 不能直接等于 m/(m/l) ,要与 n 取个 min。但估计只有我会犯这种低级错误吧?。。。
__EOF__
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具