核心思路就是BFS搜索,再加上记录算过的余数,不重复计算
#include<cstdio>
#include<deque>
#include<vector>
#include<utility>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int N, M, x;
bool flag[5000];
while (scanf("%d", &N) != EOF)
{
scanf("%d", &M);
vector<int> digits;
for (int i = 0; i < M; i++)
{
scanf("%d", &x);
digits.push_back(x);
}
if (!N)
{
puts("0");
continue;
}
sort(digits.begin(), digits.end());
deque<pair<string, int> > queue;
bool find = false;
memset(flag, 0, sizeof(flag));
int rem;
for (size_t i = 0; i < digits.size(); i++)
if (digits[i])
{
if (digits[i] % N == 0)
{
find = true;
cout << digits[i] << endl;
break;
}
else
{
string s;
s += (digits[i] + '0');
rem = digits[i] % N;
flag[rem] = true;
queue.push_back(make_pair(s, rem));
}
}
if (find)
continue;
pair<string, int> now;
while (!queue.empty() && !find)
{
now = queue.front();
queue.pop_front();
string s = now.first;
int rem = now.second;
for (size_t i = 0; i < digits.size(); i++)
{
int next = rem * 10 + digits[i];
int temp = next % N;
string ss = s;
ss += (digits[i] + '0');
if (temp)
{
if (!flag[temp])
{
flag[temp] = true;
queue.push_back(make_pair(ss, temp));
}
}
else
{
cout << ss << endl;
find = true;
break;
}
}
}
if (!find)
puts("0");
}
return 0;
}