CodeForces 1594F Ideal Farm
Farmer John 有 s 只奶牛,和 n 个独立的篱笆,每个篱笆里可以圈养一些奶牛。出于一种奇♂️怪的偏好,Farmer John 把篱笆排成了一排。第 i 个篱笆圈养的奶牛数量为 ai,显然我们有 ∑i=1nai=s。而且,处于 Farmer John 的癖好,他要求对于每个 i 都有 ai>0。
Bessie 认为一个农场是“幸运的”当且仅当你可以找到一个区间 [l,r],使得 ∑i=lrai=k。
而得寸进尺的 Bessie 认为一个农场是“牛逼的”当且仅当不管 Farmer John 怎么安置他的奶牛,该农场都是“幸运的”。
现在有 t(1≤t≤105) 组询问,每组询问给出 s,n 和 k(1≤s,n,k≤1018,n≤s),询问这个农场是不是“牛逼的”。
由于是区间问题,我们考虑先将其转换为两点问题。考虑 bi=∑j=1iai,于是我们有 {b0=0bn=s。如果存在一对 ⟨i,j⟩ 满足 bj−bi=k,那显然这个农场是幸运的。由于 ai>0,每一个 bi 都是两两不同的。于是问题就转化成了,在 1∼s 中选出 n 个数,使得这些数中不存在 k,且不存在一对 ⟨i,j⟩ 满足 j−i=k。
下面我们贪心地考虑最多能选出多少个满足条件的数。
考虑到不能有 k 这个条件,我们把 k 的倍数和不是 k 的倍数的数分开讨论,对于不是 k 倍数的数,如果我们选了 x,那我们就不能选 x+k 了(如果 x+k≤s 的话)。于是我们考虑对每 2k 个划分为一段,这样除了最后一段不满的,就有 ⌊2ks⌋ 段,而每一段我们可以贪心地选择 1∼k−1,这样保证了最后留下的 s mod 2k 个数能尽量多取,于是这对于不是 k 倍数的数,这 ⌊2ks⌋ 段可以选择 ⌊2ks⌋⋅(k−1) 个数。然后我们考虑是 k 倍数,由于不能选择 k,我们只能选择 2k 的倍数。这样这 ⌊2ks⌋ 段我们就能选取 ⌊2ks⌋ 个数。于是前 ⌊2ks⌋ 段一共最多能选取 ⌊2ks⌋⋅k 个数。
然后我们考虑最后留下的 s mod 2k 个数,我们不难发现最多只能选这里面前 k−1 个数了(第 k 个数不能选了是因为我们已经选了原序列中第 k⋅⌊2ks⌋ 个数了)。因此,这一部分最多能选 min{s mod 2k,k−1} 个数。
然而上面那段忘记了一个条件,那就是第 s 个数是必须要选的,因为 bn=s。但是大部分情况下这没有关系,因为如果第 s 个数没有选的话,那我们肯定选择了第 s−k 个数(因为我们是贪心选最多的,如果第 s−k 个数和第 s 个数都不选的话,那就不是最优的了,因为可以选一个使所选数加一),于是我们把第 s−k 个数删去,选择第 s 个数即可。唯一的影响在于如果当 s=k 的时候,那既然第 s 个数一定要选,那么答案就只能是 YES
了。
所以,我们最终只要比较 ⌊2ks⌋⋅k+min{s mod 2k,k−1} 与 n 的大小即可得出答案。