题目意思:
给一个N,给nn个jj进制的数字,问最小的不超过500位的由这些数字组成的jj进制数是十进制数N的正整数倍。
解题思路:
BFS。
因为N<=5000,所以用余数判重。
代码:
#include #include #include #include #include #include #include #include #include #include #include #include #include #define eps 1e-6 #define INF 0x1f1f1f1f #define PI acos(-1.0) #define ll __int64 #define lson l,m,(rt<<1) #define rson m+1,r,(rt<<1)|1 //#pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; /* freopen("data.in","r",stdin); freopen("data.out","w",stdout); */ bool vis[5500]; char save[20]; int n,jj,nn; struct Inf { string s; int m,len; }; bool cmp(char a,char b) { return int(a)myq; for(int i=1;i<=nn;i++) { if(save[i]=='0') continue; Inf tmp; tmp.s="",tmp.len=1; tmp.s+=save[i]; tmp.m=((save[i]>='0'&&save[i]<='9') (save[i]-'0'):(10+save[i]-'A'))%n; if(tmp.m==0) //只有一位的情况 特殊处理 { cout<='0'&&save[i]<='9') (save[i]-'0'):(10+save[i]-'A'); int t=(tt.m*jj+aa)%n; if(!t) //不小于2位的情况 { cout<=500) //超过500位 continue; cur.s=tt.s+save[i]; cur.m=t; myq.push(cur); } } printf("give me the bomb please\n"); return ; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d%d",&n,&jj,&nn); getchar(); //fflush(stdin); //由于这句话 ,wa了一上午 for(int i=1;i<=nn;i++) scanf("%s",save+i); //save[nn+1]='\0'; sort(save+1,save+nn+1,cmp); if(n==0) { if(save[1]=='0') printf("0\n"); else printf("give me the bomb please\n"); continue; } //printf("%s\n",save+1); bfs(); } return 0; }