NOIP 好数
题解,这道题呢一看数据就很小,很轻松就可以看出来是道水题。
有两种暴力做法,一种是先暴力打个表,把所有好数判断出来,然后它要什么答什么就OK。另一种是在它问了之后再去找比它大的m个数。
判断一个数是不是好数只用看他转换为三进制下的每一位是多少就行。只需要除以每一个三的n次方就行
#include<bits/stdc++.h>
using namespace std;
bool shu[3000000];
int basic[15];
int n,m;
int T;
bool check(int x){
int cnt1=0,cnt2=0;
int w=1;
int y=x%3;
if(y==1) cnt1=1;
if(y==2) cnt2=1;
x-=y;
while(x/basic[w]){
if(x/basic[w]>=3){
int y=x/basic[w];
w++;
if(y%3==0){
continue;
}
if(y%3==1){
x-=basic[w-1];
cnt1++;
continue;
}
if(y%3==2){
x-=2*basic[w-1];
cnt2++;
continue;
}
}
else{
if(x/basic[w]==0){
break;
}
else if(x/basic[w]==1){
cnt1++;
}
else if(x/basic[w]==2){
cnt2++;
}
break;
}
}
if(cnt1==cnt2) return true;
return false;
}
int main(){
basic[0]=1;
for(int i=1;i<=15;i++){
basic[i]=basic[i-1]*3;
}
for(int i=0;i<=3000000;i++){
if(check(i)){
shu[i]=1;
}
}
shu[0]=1;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
int cnt=0;
for(int i=0;cnt<m;i++){
if(n<=i&&shu[i]){
if(cnt<m-1)
printf("%d ",i);
else printf("%d",i);
cnt++;
}
}
if(T!=0)
printf("\n");
else break;
}
}