余数500 * 数位和5000 = 25w种情况
BFS先达到该种状态的一定数值最小
#include <bits/stdc++.h>
using namespace std;
struct node
{
int num, yu, sum;
};
queue<node> que;
node fr[520][5020];
bool vis[520][5020];
string str;
int main()
{
int D, S;
cin >> D >> S;
for (int i = 1; i <= 9; i++) // 第一位1-9
{
node t;
t.num = i, t.yu = i % D, t.sum = i;
vis[t.yu][t.sum] = 1;
fr[t.yu][t.sum].num = -1;
que.push(t);
}
node ed;
ed.num = -1;
while (!que.empty())
{
node now = que.front();
que.pop();
if (now.yu == 0 && now.sum == S)
{
ed = now;
break;
}
for (int i = 0; i <= 9; i++)
{
node t;
t.num = i, t.yu = (now.yu * 10 + i) % D, t.sum = now.sum + i;
if (vis[t.yu][t.sum] == 1) // 该状态在更小的数时已达到
continue;
if (t.sum > S)
continue;
vis[t.yu][t.sum] = 1;
fr[t.yu][t.sum] = now;
que.push(t);
}
}
if (ed.num == -1)
cout << "-1" << endl;
else
{
while (ed.num != -1)
{
str += '0' + ed.num; /// str[t] = '0' + ed.num ×××
ed = fr[ed.yu][ed.sum];
}
int len = str.length();
for(int i = len - 1; i >= 0; i--)
cout << str[i];
cout << endl;
}
return 0;
}