CF1594F. Ideal Farm

题目描述

题解

考虑到如果 $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;
}

 

posted @ 2021-10-21 20:08  xjqxjq  阅读(39)  评论(0编辑  收藏  举报