Codeforces Contest 1070 problem A Find a Number —— bfs求a的最小倍数且所有位的和是b

2024-04-07 00:32

本文主要是介绍Codeforces Contest 1070 problem A Find a Number —— bfs求a的最小倍数且所有位的和是b,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

You are given two positive integers d and s. Find minimal positive integer n which is divisible by d and has sum of digits equal to s.

Input
The first line contains two positive integers d and s (1≤d≤500,1≤s≤5000) separated by space.

Output
Print the required number or -1 if it doesn’t exist.

Examples
inputCopy
13 50
outputCopy
699998
inputCopy
61 2
outputCopy
1000000000000000000000000000001
inputCopy
15 50
outputCopy
-1

题意:

给你a和b,让你找出一个数使得这个数是a的倍数并且它所有位的和是b,且这个数最小。

题解:

我以前做过这道题目?好像是这样的,但是没什么印象了。而且我两次用的都是bfs!
因为它要你求得最小的数,那么我就觉得是bfs往下,这样求到的肯定是最小的,因为我是从小到大for的,dp不是dp,他只是一个类似vis的效果。我们记录两个状态:res:余数和sum:累加,如果之后有遇到过和之前一样的状态的话,那肯定是前面的优一点了,就算把dp全求出来,,也不过n*m的复杂度。输出由于我们是从高位往低位bfs的,那就dfs输出就好了。
如果从低位往高位bfs的话,余数的处理就会变得麻烦一点。。吧

#include<bits/stdc++.h>
using namespace std;
#define pa pair<int,int>
struct node
{int sum,num,res;node(){}node(int s,int n,int r):sum(s),num(n),res(r){}
}pre[505][5005];
void dfs(int x,int res)
{if(x==0&&res==0)return ;dfs(pre[res][x].sum,pre[res][x].res);printf("%d",pre[res][x].num);
}
int dp[505][5005];
int main()
{int n,m;scanf("%d%d",&n,&m);queue<node>Q;Q.push(node(0,0,0));dp[0][0]=1;int ans=-1;while(!Q.empty()){node v=Q.front();Q.pop();for(int i=0;i<=9;i++){if(i+v.sum>m)break;node ne;ne.res=(v.res*10+i)%n;ne.sum=v.sum+i;if(dp[ne.res][ne.sum])continue;pre[ne.res][ne.sum].res=v.res;pre[ne.res][ne.sum].sum=v.sum;pre[ne.res][ne.sum].num=i;dp[ne.res][ne.sum]=1;Q.push(node(ne.sum,i,ne.res));if(ne.sum==m&&ne.res==0){ans=m;break;}}if(ans!=-1)break;}if(ans==-1)return 0*printf("-1\n");dfs(ans,0);return 0;
}

这篇关于Codeforces Contest 1070 problem A Find a Number —— bfs求a的最小倍数且所有位的和是b的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/881229

相关文章

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

Python将大量遥感数据的值缩放指定倍数的方法(推荐)

《Python将大量遥感数据的值缩放指定倍数的方法(推荐)》本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像... 本文介绍基于python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

C#实现获得某个枚举的所有名称

《C#实现获得某个枚举的所有名称》这篇文章主要为大家详细介绍了C#如何实现获得某个枚举的所有名称,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... C#中获得某个枚举的所有名称using System;using System.Collections.Generic;usi

通过C#获取PDF中指定文本或所有文本的字体信息

《通过C#获取PDF中指定文本或所有文本的字体信息》在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响,然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文... 目录引言C# 获取PDF中指定文本的字体信息C# 获取PDF文档中用到的所有字体信息引言在设计和出

hdu1254(嵌套bfs,两次bfs)

/*第一次做这种题感觉很有压力,思路还是有点混乱,总是wa,改了好多次才ac的思路:把箱子的移动当做第一层bfs,队列节点要用到当前箱子坐标(x,y),走的次数step,当前人的weizhi(man_x,man_y),要判断人能否将箱子推到某点时要嵌套第二层bfs(人的移动);代码如下:

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

usaco 1.2 Name That Number(数字字母转化)

巧妙的利用code[b[0]-'A'] 将字符ABC...Z转换为数字 需要注意的是重新开一个数组 c [ ] 存储字符串 应人为的在末尾附上 ‘ \ 0 ’ 详见代码: /*ID: who jayLANG: C++TASK: namenum*/#include<stdio.h>#include<string.h>int main(){FILE *fin = fopen (

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

poj 1287 Networking(prim or kruscal最小生成树)

题意给你点与点间距离,求最小生成树。 注意点是,两点之间可能有不同的路,输入的时候选择最小的,和之前有道最短路WA的题目类似。 prim代码: #include<stdio.h>const int MaxN = 51;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int P;int prim(){bool vis[MaxN];