ps:这种bug我要是会调试就不用这么傻逼地看一天了。。。。。。。。。。。
#include<bits/stdc++.h>
using namespace std;
struct node{
int a,b,c,e;
node(int aa=0,int bb=0,int cc=0,int ee=0){
a=aa;b=bb;c=cc;e=ee;
}
bool operator < (const node &x) const{
if(a!=x.a)
return a<x.a;
else if(b!=x.b)
return b<x.b;
else if(c!=x.c)
return c<x.c;
else
return e<x.e;
}
};
int n,m;
int l[1026*1000]; //之前数字开成1026结果solve()里面的fa[0]突然莫名其妙从-1变成了9。。。
int r[1026*1000];
int fa[1026*1000];
int vis[1026][1005];
int x[2000005],y[2000005];
void solve(){
queue<node> q;
q.push(node(0,0,0,-1)); //取数状态,个数,余数,哈希下标
int g=-1;
vis[0][0]=1;
while(!q.empty()){
node fr=q.front();
q.pop();
int a=fr.a,b=fr.b,c=fr.c,e=fr.e;
for(int i=0;i<10;++i){
if(e==-1&&i==0) continue; //积有前导0
if(!(a&(1<<i))&&b==m) continue; //个数超过m
if(vis[a|(1<<i)][(c*10+i)%n]==1) continue; //以[状态][余数]做标记
vis[a|(1<<i)][(c*10+i)%n]=1;
node w;
w.a=(a|(1<<i));
w.b=b+((a&(1<<i))?0:1);
w.c=(c*10+i)%n; //学习由【(余数*10+该位)%n】得出新的余数
w.e=++g;
fa[w.e]=e;
l[w.e]=i;
r[w.e]=(c*10+i)/n; //学习由【余数/除数】得出第几位商
if(w.b==m&&w.c==0){
int p=-1;
e=w.e;
while(e!=-1){
x[++p]=l[e];
y[p]=r[e];
e=fa[e];
}
for(int j=p;j>=0;--j)
printf("%d",x[j]);
printf("=%d*",n);
int j;
for(j=p;j>=0;--j){
if(y[j]!=0) //去掉乘数的前导0
break;
}
for(;j>=0;--j)
printf("%d",y[j]);
printf("\n");
return;
}
q.push(w);
}
}
printf("Impossible\n");
}
int main(){
int t;
cin>>t;
while(t--){
memset(vis,0,sizeof(vis));
memset(fa,-1,sizeof(fa));
cin>>n>>m;
if(n==0){
if(m==1)
printf("0\n");
else
printf("Impossible\n");
continue;
}
solve();
}
return 0;
}