#include <cstring>
#include <algorithm>
#include <queue>
#include <climits>
#include <string>
#include <iostream>
using namespace std;
string res,tmp;
int min_len,End,len;
bool flag,vis[10010];
int num[4];
int n,k;
struct node{
int num,val,pre,len;
}q[10010];
bool bfs(int m){ //最长的位数
memset(vis,false,sizeof(vis));
int head=0,tail=-1;
node now,next;
for(int i=1;i<=m;i++){
if(num[i]){
now.len = 0;
now.num = num[i];
now.pre = -1;
now.val = num[i]%n; //当前的余数
q[++tail] = now;
vis[now.val] = 1;
}
}
while(head<=tail){
now = q[head];
if(now.len > min_len) break;
if(now.val == 0){
End = head;
len = now.len;
return true;
}
for(int i=1;i<=m;i++){
next = now;
next.val = (now.val*k+num[i])%n;
if(!vis[next.val]){
vis[next.val] = true;
next.len++;
next.num = num[i];
next.pre = head;
q[++tail] = next; //入队新的节点
}
}
head++;
}
return false;
}
void getString(int idx){
if(idx==-1) return;
getString(q[idx].pre);
tmp += (q[idx].num+'0');
}
int main(){
while(scanf("%d%d",&n,&k)!=EOF){ //原来的数字n,求其倍数,最小不同的数字组成 k是进制
res = "";
min_len = INT_MAX;
flag = false;
for(int i=1;i<k;i++){ //k进制下,非0的数都是0到k-1,枚举都是相同数的
num[1] = i;
if(bfs(1)){
flag = true; //标记为有解
tmp = "";
getString(End);
if(len<min_len ||(len==min_len && tmp<res)){
res = tmp;
min_len = len;
}
}
}
if(flag){
cout<<res<<endl;
continue;
}
for(int i=0;i<k;i++){
num[1] = i;
for(int j=i+1;j<k;j++){
num[2] = j;
if(bfs(2)){
tmp = "";
getString(End);
if(len<min_len || (len==min_len && tmp<res)){
res = tmp;
min_len = len;
}
}
}
}
cout<<res<<endl;
}
return 0;
}
07-14
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交