题意:
给两个整数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;
}

本文探讨了如何找到满足特定除法和数字和条件的最小整数。通过使用广度优先搜索算法,文章详细解释了如何构建状态空间,并逐步探索所有可能的整数,直到找到符合条件的第一个解。该方法确保了效率和正确性。
Find a Number&spm=1001.2101.3001.5002&articleId=84034472&d=1&t=3&u=8baa1dc741d54681a280dcafb25eae5a)
5138

被折叠的 条评论
为什么被折叠?



