利用同余的性质,去最小数广搜n的每一个余数。
ACcode:
#include<cstdio>
#include<cstring>
#include<queue>
#include<iostream>
#include<algorithm>
using namespace std;
queue<int> q;
int n,m,p;
int use[11],v[11000],pre[11111];
void print(int k)
{
if (k!=-1)
{
print(pre[k]);
putchar(v[k]+48);
}
}
void bfs()
{
int t,r;
for (int i=1; i<10; i++)
if (use[i])
{
r=i%n;
if (r==0)
{
printf("%c\n",i+48);
return ;
}
if (v[r]<0)
{
v[r]=i;
q.push(r);
pre[r]=-1;
}
}
while (!q.empty())
{
t=q.front();
q.pop();
for (int i=0; i<10; i++)
if (use[i])
{
r=(t*10+i)%n;
if (r==0)
{
print(pre[t]);
printf("%c%c\n",v[t]+48,i+48);
return ;
}
if (v[r]<0)
{
v[r]=i;
q.push(r);
pre[r]=t;
}
}
}
printf("-1\n");
return ;
}
int main()
{
int cas=0;
while (~scanf("%d%d",&n,&m))
{
while (!q.empty()) q.pop();
for (int i=0; i<n; i++) v[i]=-1;
for (int i=0; i<10; i++) use[i]=1;
for (int i=0; i<m; i++)
{
scanf("%d",&p);
use[p]=0;
}
printf("Case %d: ",++cas);
bfs();
}
return 0;
}