题意 :
- 将s个物品分为n堆,每堆编号1~n,且保证每堆内至少有一个物品,问是否对于任意的一种物品分配方式都存在一个连续区间 [ l , r ] [l,r] [l,r]使得,这段区间内对应堆中物品数量和为k
思路 :
- s = k s=k s=k,即每次取所有堆的情况,显然成立
- s < k s<k s<k,取所有物品也到不了k,显然不成立
- s > k s>k s>k,考虑能否构造一个所用物品最小,且不满足条件的分配方式(首先想到的是 k + 1 k+1 k+1可以使得物品和不是k,以及连续的 k − 1 k-1 k−1个1,这样肯定是不满足条件的分配方式):
- 不难发现这样的构造方式下,需要对每个堆分发一个物品,剩下的物品数量是 s − n s-n s−n,而下标为k的倍数的位置,需要再多分配k个物品,总计为 ⌊ n k ⌋ ∗ k \lfloor \frac{n}{k} \rfloor * k ⌊kn⌋∗k个物品,那么当 s − n < ⌊ n k ⌋ ∗ k s-n<\lfloor \frac{n}{k} \rfloor * k s−n<⌊kn⌋∗k时无法构造
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
void solve()
{
ll s, n, k;
cin >> s >> n >> k;
if (s == k) cout << "yes" << endl;
else if (s < k) cout << "no" << endl;
else
cout << (n / k * k > s - n ? "yes" : "no") << endl;
}
int main()
{
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int _ = 1;
cin >> _;
while (_ -- )
{
solve();
}
return 0;
}