上来一看只会暴力,网上看了看资料,知道了还有一个剪枝
假设A,B对于X的余数相同
那么 (10*A+d[i])%x = (10*B+d[i])%x ,所以只有当余数没出现过的情况下才加入到搜索的队列中来
另外还有一个问题,就是可能是最后的答案出现很庞大的位数,所以要用指针,这里我是用数组模拟。
还有就是单独处理N=0的情况 ,RE了好几次
#include<cstdio>
#include<stdlib.h>
#include<queue>
#include<cstring>
#define INF 1000000000
using namespace std;
int n,m,d[150];
struct point{
int yu;
int pre;
int now;
}que[10000];
int cmp(const void * a,const void * b){
int * aa=(int *)a;
int * bb=(int *)b;
return *aa-*bb;
}
void print(int tem){
if(que[tem].pre!=-1){
print(que[tem].pre);
printf("%d",que[tem].now);
}
}
int bfs(){
int front=0,rear=0;
int flag[5010];
que[rear].now=0;
que[rear].pre=-1;
que[rear++].yu=0;
memset(flag,0,sizeof(flag));
while(front<rear){
struct point tem;
tem=que[front];
for(int i=0;i<m;i++){
int temp=(tem.yu*10+d[i])%n;
if(!flag[temp] && (tem.pre!=-1 || d[i]>0)){
struct point st;
st.now=d[i];
st.yu=temp;
st.pre=front;
flag[temp]=1;
que[rear++]=st;
if(temp==0){
print(rear-1);
printf("\n");
return 1;
}
}
}
front++;
}
return 0;
}
int main(){
int i;
while(scanf("%d",&n)!=EOF){
scanf("%d",&m);
for(i=0;i<m;i++)
scanf("%d",&d[i]);
qsort(d,m,sizeof(d[0]),cmp);
if(n==0){
printf("0\n");
}
else if(!bfs())
printf("0\n");
}
}