嗷嗷嗷。
先是RE,再来 WA ,最后TLE。
然后找了半天才知道哪儿有问题。
RE是因为n==0;
然后WA是因为开始不知道这个数可能很大。
比如 4999 1 1.是一个非常大的数。
最后TLE 是因为 我的结构体是这样的
struct lx
{
int num[501];
int top;
int mod;
};
我把数 都存在里面了。然后用stl出队的时候 数组有个复制过程,这样就得超时。
不过ZOJ 的1136 可以AC。数据量应该比较少。
最后只能用静态链表,每次只记录最后一位的值,然后用next 存上一位的 结构体下标。
struct lx
{
int num;
int next;
int mod;
};
至于队列,用stl还怎么找下标?只能存地址了,毕竟不方便。
还是手写了。手写的话节点开5001就够了,毕竟用余数判重后 最多也就5000个。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[101],m,n;
bool vis[5010];
struct lx
{
int num;
int next;
int mod;
}q[5010];
int bfs()
{
int top,end;
top=end=1;
q[0].next=-1;
for(int i=0;i<m;i++)
{
int mod=a[i]%n;
if(!vis[mod]&&a[i])
{
q[top].mod=mod;
q[top].num=a[i];
q[top].next=0;
top++;vis[mod]=1;
if(mod==0){printf("%d\n",a[i]);return 1;}
}
}
while(top!=end)
{
for(int t=top;end<top;end++)
{
int mod=q[end].mod;
for(int i=0;i<m;i++)
{
int tmp=(mod*10+a[i])%n;
if(!vis[tmp])
{
q[top].num=a[i];
q[top].next=end;
q[top].mod=tmp;
top++,vis[tmp]=1;
}
if(tmp==0)
{
int k=top-1;
int num[5001],j=0;
while(q[k].next!=-1)
{
num[j++]=q[k].num;
k=q[k].next;
}
while(j--)
printf("%d",num[j]);
printf("\n");
return 1;
}
}
}
}
return 0;
}
int main()
{
while(~scanf("%d",&n))
{
scanf("%d",&m);
for(int i=0;i<m;i++)
scanf("%d",&a[i]);
if(!n){puts("0");continue;}
memset(vis,0,sizeof(vis));
sort(a,a+m);
if(!bfs())puts("0");
}
}