题意:
给两个整数d和s,求出最小的整数n满足n%d==0且n的每一位数字和是s。
分析:
令状态{i, j}表示对d取模为i,数字位数和为j时的最小数,因为是从小到大枚举,所以可以保证第一次到达{i=0,j=s}的状态的数字就是最小值。
代码:
#include <bits/stdc++.h>
using namespace std;
#define ms(a,b) memset(a,b,sizeof(a))
#define lson rt*2,l,(l+r)/2
#define rson rt*2+1,(l+r)/2+1,r
typedef unsigned long long ull;
typedef long long ll;
const int MAXN=505;
const double EPS=1e-8;
const int INF=0x3f3f3f3f;
const int MOD = 1e9+7;
int vis[MAXN][MAXN*10],d,s;
struct Node {
int mod;
int s;
string ans;
};
string bfs(){
queue<Node> q;
q.push({0,0,""});
vis[0][0] = 1;
while(!q.empty()) {
Node t = q.front(); q.pop();
if(t.mod == 0 && t.s == s) return t.ans;
for(int i=0;i<=9;i++) {
int mod = (t.mod*10+i)%d, sum = t.s + i;
if(sum<=s && !vis[mod][sum]) {
vis[mod][sum] = 1;
q.push({mod,sum,t.ans+(char)(i+'0')});
}
}
}
return "-1";
}
int main(){
ios::sync_with_stdio(false);
while(cin >> d >> s) {
ms(vis,0);
cout << bfs() << endl;
}
return 0;
}