按题解打的,但跑的特别慢
#include<bits/stdc++.h>
using namespace std;
#define pb emplace_back
const int N=4e5+10, LN=25;
int f[LN][N], a[N], b[N], n; bool v[N]; vector<int> di[N];
inline int calc(int l, int r){
if(l>r) return -1;
int D=log2(r-l+1);
return f[D][l]&f[D][r-(1<<D)+1];
}
inline int query(int x, int y){
if(x>y) swap(x, y);
return calc(1, x-1)&calc(x+1, y-1)&calc(y+1, n);
}
inline int gcd(int x, int y){
if(x==0) return y;
else return gcd(y%x, x);
}
inline void init(){
for(int i=1; i<=N-10; i++)
for(int j=i; j<=N-10; j+=i)
di[j].pb(i);
}
int main(){
//freopen("a.in", "r", stdin);
int T; scanf("%d", &T); init();
while(T--){
int x, ma=0; scanf("%d%d", &n, &x);
for(int i=1; i<=n; i++){
scanf("%d", &a[i]);
ma=max(ma, a[i]);
f[0][i]=a[i];
}
for(int i=1; i<=ma; i++) b[i]=0;
for(int i=1; i<=n; i++) v[i]=0;
for(int j=1; (1<<j)<=n; j++)
for(int i=1; i<=n-(1<<j)+1; i++)
f[j][i]=f[j-1][i]&f[j-1][i+(1<<(j-1))];
vector<int> S; bool flag=0;
for(int i=0; i<=20; i++){
vector<int> V;
for(int j=1; j<=n; j++)
if((~a[j])&(1<<i)) V.pb(j);
if(V.size()<=2){
for(int j: V) S.pb(j), v[j]=1;
}
}
for(int i=1; i<=n; i++) if(!v[i])
for(int j: di[a[i]]) b[j]++;
for(int i=ma; i>=1; i--) if(b[i]>=2){
vector<int> V;
for(int j=1; j<=n && (V.size()<2); j++)
if(a[j]%i==0 && !v[j]) V.pb(j);
int d=gcd(a[V[0]], a[V[1]]), tt=query(V[0], V[1]);
if(d>tt+x){
printf("YES\n2 %d %d\n%d ", a[V[0]], a[V[1]], n-2);
for(int j=1; j<=n; j++) if(j!=V[0] && j!=V[1])
printf("%d ", a[j]);
printf("\n");
flag=1; break;
}
}
if(!flag){
sort(S.begin(), S.end()); S.erase(unique(S.begin(), S.end()), S.end());
for(int i: S){
for(int j=1; j<=n; j++) if(i!=j){
int d=gcd(a[i], a[j]), tt=query(i, j);
if(d>tt+x){
printf("YES\n2 %d %d\n%d ", a[i], a[j], n-2);
for(int k=1; k<=n; k++) if(k!=i && k!=j)
printf("%d ", a[k]);
printf("\n");
flag=1; break;
}
}
if(flag) break;
}
}
if(!flag) printf("NO\n");
}
return 0;
}