给定两个数 n , m < = 1 0 8 n,m<=10^8 n,m<=108 ,请选择两个数 x , y x,y x,y ,使得 m + y m+y m+y 是 n − x n-x n−x 的倍数且 x + y x+y x+y 最小。
输出 x + y x+y x+y 的最小值。
前置知识:数论分块
假设要计算 ∑ x = 1 n ⌊ n / x ⌋ \sum_{x=1}^{n}\lfloor n/x \rfloor ∑x=1n⌊n/x⌋ ,将x的取值范围分为很多个块,每个块内答案相等,若某个块的答案为 k k k,则该块的右端点为 ⌊ n / k ⌋ \lfloor n/k \rfloor ⌊n/k⌋ 。
于是在 O ( n ) O(\sqrt n) O(n)的复杂度内即可计算完成。
分析:
假设已经定下了 x x x ,设 t = n − x t=n-x t=n−x ,我们可以直接确定 y y y 的大小。
y = ⌈ m / t ⌉ ∗ t − m y=\lceil m/t \rceil *t-m y=⌈m/t⌉∗t−m
则 x + y = ( ⌈ m / t ⌉ − 1 ) ∗ t + n − m x+y=(\lceil m/t \rceil-1) *t+n-m x+y=(⌈m/t⌉−1)∗t+n−m
向上取整可以通过一个公式转化为向下取整
⌈ x / y ⌉ = ⌊ ( x − 1 ) / y ⌋ + 1 \lceil x/y \rceil =\lfloor (x-1)/y \rfloor +1 ⌈x/y⌉=⌊(x−1)/y⌋+1
于是 x + y = ( ⌊ ( m − 1 ) / t ⌋ ) ∗ t + n − m x+y=(\lfloor (m-1)/t \rfloor) *t+n-m x+y=(⌊(m−1)/t⌋)∗t+n−m
此时可以使用数论分块解决该问题,取每个块的左端点即可。