这题由于最后结果可能会比较大,不能直接用int 存储,有一个小小的数学知识:
若 (x*10+c)%n==0, 则 ((x%n)*10+c)==0, 这个证明的话把x写成 a*n+b在纸上算一算就出来了
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <vector>
#include <functional>
#include <queue>
using namespace std;
vector<int> num, re;
typedef struct
{
int x, va, head;
}que;
que q[5001];
bool cmp(int a, int b)
{
return a<b;
}
int main()
{
int n, m, t, i, j, x, b[5001];
while(scanf("%d%d", &n, &m)!=EOF)
{
num.clear();
memset(b, 0, sizeof(b));
re.clear();
for(i=0; i<m; i++)
{
scanf("%d", &t);
num.push_back(t);
}
if(n==0)
{
printf("0\n");
continue;
}
sort(num.begin(), num.end(), cmp);
int head=0, end=0;
q[0].x=0; q[0].va=0; q[0].head=0;
while(head<=end)
{
for(i=0; i<m; i++)
{
if(head==0&&num[i]==0) continue;
x=(q[head].x*10+num[i])%n;
if(!b[x])
{
end++;
q[end].x=x;
q[end].head=head;
q[end].va=num[i];
b[x]=1;
if(x==0)
{
while(end!=0)
{
re.push_back(q[end].va);
end=q[end].head;
}
for(j=re.size()-1; j>=0; j--)
printf("%d", re[j]);
printf("\n");
goto hhh;
}
}
}
head++;
}
printf("0\n");
hhh:;
}
return 0;
}