题意:给出一个数 a,构造一组 l,r 使得 ∑i=lrf(i)≡0(moda)。其中 a≤1018,l,r≤10200。
分析:
以下用 (l,r) 表示构造出来的一对 l,r,f(l,r)=∑i=lrf(i)。
考虑从某个值一步一步移动到模 a 余 0 的情况。如果选择 (0,9),发现 f(1,10)=f(0,9)+1。这很好理解,f(1,10) 相当于 f(0,9)−f(0)+f(10),10 比 0 的最高位多 1,所以使得 f(1,10)=f(0,9)+1。一直从 f(0,9) 推到 f(9,19) 都是这种情况,但是 f(10,20)≠f(9,19)+1,因为 19 发生了进位,导致两边低位的变化不同。如果将十位的 1 移至足够高的数位,就能在移动区间的时候不发生进位。
所以,一开始我们选择 (0,1018−1),因为 a≤1018,区间至多右移 1018 次,不会发生进位。不难发现,现在需要移动的步数就是 a−f(0,1018−1) % a。通过简单的计算,得到 f(0,1018−1)=45×18×1017=81×1018,于是答案为 (81×1018 % a,1018−1+81×1018 % a)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通