a%n==x
(a*10+b)%n==(x*10+b)%b
要用数组存下余数优化,如果遇到余数为0代表算对了
当所有的余数都算了,就是没有0的时候,就直接输出0
#include <bits/stdc++.h>
using namespace std;
struct str
{
string s;
int res;
};
int cmp(str a,str b)
{
return a.res<b.res;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n;
while(scanf("%d",&n)!=EOF){
int m;scanf("%d",&m);
str as[100];
queue<str> q;
int m2=0;
for (int i=0;i<m;i++){
scanf("%d", &as[i].res);
as[i].s+=char('0'+as[i].res);
//数可能很大存不下来
}
sort(as,as+m,cmp);//排序找最小的值
if (n==0){
printf("0\n");
continue;
}
for (int i=0;i<m;i++){
q.push(as[i]);
}
str ans;
int mark[5005]={0};
int num=0;
int ok=0;
while(!q.empty()){
ans = q.front();
q.pop();
if (ans.s=="0") continue;
if (ans.res==0){
cout<<ans.s<<endl;
ok=1;
break;
}
if (mark[ans.res]) continue;
//计算过了,,
mark[ans.res]=1;
for (int i=0;i<m;i++){
str ans2;
ans2.res=(ans.res*10+as[i].res)%n;
ans2.s=ans.s+as[i].s;
if (mark[ans2.res]) continue;
//计算过了
q.push(ans2);
}
}
if (!ok) printf("0\n");
while(!q.empty()){
q.pop();
}
}
return 0;
}