用数组保存三进制,统计一和二的个数,枚举
#include<bits/stdc++.h>
using namespace std;
int i,j,k,l,m,n;
int ha[100010];
int main(){
// freopen("A.in","r",stdin);
// freopen("A.out","w",stdout);
scanf("%d",&l);
for(int x=1;x<=l;++x){
scanf("%d%d",&n,&m);
if(n<=5) n=5;
memset(ha,0,sizeof(ha));
k=n;
while(n){
ha[++ha[0]]=n%3;
n/=3;
}
for(int z=k;m;++z){
i=j=0;
for(int y=1;y<=ha[0];++y){
if(ha[y]&1) ++i;
else if(ha[y]) ++j;
}
if(i==j){
if(m==1) printf("%d",z);
else printf("%d ",z);
--m;
if(!m) printf("\n");
}
++ha[1];
for(int z=1;z<=ha[0];++z)
if(ha[z]>=3){
ha[z+1]+=(ha[z]/3);
ha[z]-=3;
if(z==ha[0]) ++ha[0];
}
}
}
}