qwq
Description
- 给定正整数 和 ,满足 。
- 要求在 中选出最多的不同整数,使得从这些整数中随便取一些数加起来,所得到的和都不是 。
- 组数据,。
Solution
首先 里面的数肯定可以选,毕竟这里面随便取一个数都已经超过 了qwq。
然后 自己肯定不能选,一元子集也是子集qwq
对于 中的数:
一方面:
- 考虑把集合 划分成 。
- 如果 是偶数,那么会多出来一个单独的 ;
- 如果 是奇数,那么刚好分完。
- 那么显而易见的一点是:对于划分出来的每一个二元子集,我们至多只能从这两个数中选一个。
- 否则,这个二元子集的和就是 ,与题意不符。
- 这表明我们取的数的个数至多就是这些二元子集的个数,也就是 。
而另一方面:
- 考虑选取 到 中的所有整数。
- 此时,对于每一个一元子集,它的和都小于 ;
- 而每一个多元子集的和必定大于这些数中最小的两个数之和,即 。
- 但是这个和已经严格 了,所以每一个多元子集的和也不可能是 。
- 所以这个构造符合题意。
而这个构造一共选取了 个数,上面已经证过至多选取 个数,故这就是最优构造。
于是最多选取的数的个数就是:。
Code:
#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cctype>
#define int long long
using namespace std;
int t,n,k;
signed main(void){
cin>>t;
while(t--){
cin>>n>>k;
cout<<(n-k)+(int)k/2<<"\n";
for(int i=k+1;i<=n;i++)cout<<i<<' ';
for(int i=k-1;i*2>=k;i--)cout<<i<<' ';
cout<<'\n';
}
return 0;
}