Codeforces - Find a Number

题目链接: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;
}
发布了604 篇原创文章 · 获赞 242 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_43826249/article/details/104398502