链接
https://vjudge.net/problem/UVA-1569
题解
广度优先搜索,我可以不断地往后加数位,然后记录对
n
n
n取模的结果
当取模的结果等于
0
0
0时,则说明我找到了答案
这样找到的第一个肯定是最优的,因为首先位数是最少的,其次根据我构造的方式得知我得到的这个数字肯定也是最小的
可以发现,如果两个数字取模的结果是一样的,那么后面它们的发展都是一模一样的,因此我可以保留较小的
换句话说,我可以根据取模的结果来剪枝
代码
#include <bits/stdc++.h>
#define maxn 10000
using namespace std;
typedef long long ll;
vector<ll> dig;
string s[20]{"0","1","2","3","4","5","6","7","8","9"};
void BFS(ll n)
{
queue< pair<string,ll> > q;
ll mi[maxn]{1}, i;
bool vis[maxn]{false};
for(auto d:dig)
{
if(d==0)continue;
q.emplace( make_pair(s[d],d%n) );
vis[d%n]=1;
}
while(!q.empty())
{
auto now = q.front(); q.pop();
if(now.second==0)
{
cout<<now.first<<endl;
return;
}
for(auto d:dig)
{
auto r=(now.second*10+d)%n;
if(!vis[r])
{
q.emplace( make_pair( now.first+s[d],r ) );
vis[r]=true;
}
}
}
cout<<0<<endl;
}
int main()
{
ll N, M;
while(cin>>N)
{
dig.clear();
cin>>M;
while(M--)
{
ll x;
cin>>x;
dig.emplace_back(x);
}
sort(dig.begin(),dig.end());
if(N==0)
{
cout<<0<<endl;
}
else BFS(N);
}
return 0;
}