问题描述:
给出两个正整数d和s,找到最小正整数n,它能被d整除,并且数字的和等于s。
输入
第一行包含两个正整数d和s(1≤d≤500,1≤s≤5000),用空格隔开。
输出
打印所需的数字或-1(如果不存在)。
案例输入
13 50
61 2
15 50
案例输出
699998
1000000000000000000000000000001
-1
分析:
从0开始bfs并且记录路径
就是一直向最后一位塞数,满足条件就输出
用到了10进制按位取余的思想
代码应该很容易看懂
code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#define set0(a) memset(a,0,sizeof(a))
#define set1(a) memset(a,-1,sizeof(a))
typedef long long ll;
const int inf=0x3f3f3f3f;
const int inn=0x80808080;
using namespace std;
struct Node{
int mod;//余数
int sum;//数位和
string s;//路径直接用string存了,比较无脑
Node(int a,int b,string c){
mod=a;sum=b;s=c;
}
};
int d,s;
int mark[505][5005];//标记是否出现过
string bfs(){
set0(mark);
mark[0][0]=1;
queue<Node>q;
q.push(Node(0,0,""));
while(!q.empty()){
Node x=q.front();
q.pop();
if(x.sum>s)continue;//大于s的不满足
if(x.mod==0&&x.sum==s){//找到就返回
return x.s;
}
for(int i=0;i<=9;i++){
int xx=(x.mod*10+i)%d;//余数
int yy=x.sum+i;//新的数位和
if(!mark[xx][yy]){
mark[xx][yy]=1;
q.push(Node(xx,yy,x.s+(char)(i+'0')));
}
}
}
return "-1";//找不到的话返回-1
}
int main(){
cin>>d>>s;
cout<<bfs()<<endl;
return 0;
}