题目描述
小轩不仅是个大学霸,而且还是个非常会穿搭的男神,所以小轩的衣服非常多,有一天小轩在收拾衣服时想到了一个问题,他有s件衣服,但却只有n个盒子,他要用这n个盒子去装这s件衣服,且每个盒子最少有1件衣服,他想考考你,是否对于所有的分配方案,每个方案都可以找到若干个连续的盒子,将这些盒子里的衣服全部装入小豪的一个大盒子里,使这个大盒子里的衣服的数量为k件。如果可以,请输出YES,否则输出NO。
输入
第一行一个T,表示样例数(1<=T<=1e5)
对于每个样例,每一行输入三个整数,s,n,k分别表示衣服的总数量,盒子的总个数,和选取若干个连续的盒子中衣服的总数量 。
( 1<= s , n , k <= 1e18 且 n <= s)
输出
对于每个样例,如果可以请输出YES,否则请输出NO。
样例输入 Copy
3 1 1 1 1 1 2 100 50 200
样例输出 Copy
YES NO NO
这道题剧难理解,所以打算写个题解
当s==k时,不管怎么分,都有一种方法,能找到n个连续的盒子,满足k;
当s<k时,不管怎么分,都不满足;
当s>k时,又要分类讨论{
在看一遍题目要求
说每个配装方案都可以找到,也就是说我们只要找出一个配装方案不符合,就可以输出NO
将题目理解为,是否存在一个配装方案使条件不成立
我们可以假设一个序列,有n项,序列之和为s,使得任意连续区间[L,R]之和不等于k
我们先自己定义一个任意区间都不为k的函数,
令前(k-1)项都为1,第k项为k+1。
然后定义一个sum,令sum=(n/k)*2k+n%k.
如果s=sum,那么存在一种配装方案,不满足条件
如果s<sum,就无法构成该序列,即任意解满足条件
如果s>sum,将s分成sum和s-sum,将s-sum加到第k项上,仍然存在一项不满足条件
}
那我们就可以写代码了