链接:https://codeforces.com/contest/1070/problem/A
难度:*2200
标签:dp
graphs
number theory
shortest paths
题目大意
找到最小的数满足这个条件:是 d d d 的整数倍,并且 各位数字 和为 s s s
题解
由于这个数字非常大,因为就算每一位都是
1
1
1 ,
s
s
s 都有
1
0
4999
10^{4999}
104999,况且有些数位还可以为
0
0
0,所以用 long long
和 __int128
都不行
使用字符串存储。
用一个结构体记录每个数的数位和,和这个数 m o d d \bmod d modd 的值
使用 BFS 暴搜可以过,记得记录一下每个值(数位和 和 余数)用没用过,如果遇到符合要求的就直接输出。
C++代码:
#include<bits/stdc++.h>
using namespace std;
const int maxd=505;
const int maxs=5005;
int D,S;
bool used[maxd][maxs];
struct Node{
int m;
int s;
string cur;
};
Node makeNode(int mod,int sum,string s){
Node ret;
ret.m=mod;
ret.s=sum;
ret.cur=s;
return ret;
}
int32_t main(){
cin>>D>>S;
used[0][0]=true;
queue<Node> q;
q.push(makeNode(0,0,""));
while(!q.empty()){
Node p=q.front();
q.pop();
if(p.s>S){
continue;
}else if(p.s==S&&p.m==0){
cout<<p.cur<<endl;
return;
}else{
for(int i=0;i<=9;i++){
Node x;
x.m=(p.m*10+i)%D;
x.s=p.s+i;
x.cur=p.cur+(char)('0'+i);
if(used[x.m][x.s]){
continue;
}
used[x.m][x.s]=true;
q.push(x);
}
}
}
cout<<-1<<endl;
return 0;
}