悬赏关注+赞博客。
#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
typedef int type;
inline type read(){
type x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch)){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
inline void write(type x){
if(x<0)putchar('-'),x=-x;
if(x>9)write(x / 10);
putchar(x%10+'0');
}
int n,d,k;
bool pd=0,ans[1000005];
void dfs(int ls,int bs,int jh) {
if(bs>n+1||jh>d||pd)return;
else if(jh+ls*((n+1)-bs)>d)return;
else if(jh+ls*((n+1)-bs)==d){
pd=1;
return;
}
else if(jh+(ls+1+((n+1)-bs+ls+1))*(n+1-bs)/2<d)return;
if(bs==n+1) {
if(jh==d)pd=1;
return;
}
if(bs+k<=n+1) {
ans[bs]=ls+1;
dfs(ls+1,bs+k,jh+(ls+1)*k);
if(pd)return;
ans[bs]=0;
}
if(true) {
dfs(ls,bs+1,jh+ls);
if(pd)return;
}
}
inline void sc() {
register int cs=1;
write(cs),putchar(' ');
for(register int i=3; i<=n; i++) {
if(ans[i]!=0)cs=i-1,ans[i]=0;
write(cs),putchar(' ');
}
}
int t;
signed main() {
ans[2]=true;
t=read();
while(t--) {
n=read(),d=read(),k=read();
dfs(1,2+k,k);
if(pd)putchar('Y'),putchar('E'),putchar('S'),putchar('\n'),sc();
else putchar('N'),putchar('O');
putchar('\n');
pd=0;
}
return 0;
}