题解
考虑到如果 $s<k$ ,说明可以,如果 $s=k$ ,说明不行,现在考虑 $s>k$ 。
假设第 $i$ 个分了 $a_i$ 个,我们不妨做个前缀和为 $p_i$ ,那也就是说如果不是理想的,说明对于 $[0,n]$ 不存在两个数 $i,j$ 满足 $p_i-p_j=k$ 。于是我们设 $q_i=p_i+k$ 。
因此我们发现 $p_i$ 和 $q_i$ 两个数列里的数各不相同。
于是我们现在有 $1$ 到 $s+k$ 除去 $k$ 这些数,要选出 $2n$ 个数,满足可以匹配为 $n$ 组,每组两个数相差为 $k$ 。
因此我们考虑对 $k$ 取模后余数相同的数最多能够分成几组即可。
效率 $O(T)$ 。
代码
#include<bits/stdc++.h> #define LL long long using namespace std; int T;LL n,k,s; void work(){ scanf("%lld%lld%lld",&s,&n,&k); if (s==k){puts("YES");return;} if (s<k){puts("NO");return;} LL v=s%k; LL w=s+k; LL u=(s-v)/k+1; if (u&1) w-=k-v-1; else w-=v+1; if (w>=n+n+1) puts("NO"); else puts("YES"); } int main(){ for (scanf("%d",&T);T--;work()); return 0; }