题目链接:Codeforces - Find a Number
能够整除d,我们可以看成%d为0。
然后和为s。
我们可以发现一共状态数量为:500*5000,所以我们bfs即可。
枚举下一个数字是什么即可。
因为要输出答案,所以我们记录一下前驱。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
int d,s,vis[510][5010],pre[510][5010][3];
void bfs(){
queue<pair<int,int> > q; q.push({0,0}); vis[0][0]=1;
while(q.size()){
int u=q.front().first,sum=q.front().second; q.pop();
for(int i=0;i<=9;i++){
int x=(u*10+i)%d,y=i+sum;
if(y<=s&&!vis[x][y]){
vis[x][y]=1; q.push({x,y});
pre[x][y][0]=u,pre[x][y][1]=sum,pre[x][y][2]=i;
}
}
}
}
void out(int x,int y){
if(pre[x][y][0]||pre[x][y][1]) out(pre[x][y][0],pre[x][y][1]);
printf("%d",pre[x][y][2]);
}
signed main(){
cin>>d>>s; bfs();
if(!vis[0][s]) puts("-1");
else out(0,s);
return 0;
}