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

相关文章

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];

poj 2349 Arctic Network uva 10369(prim or kruscal最小生成树)

题目很麻烦,因为不熟悉最小生成树的算法调试了好久。 感觉网上的题目解释都没说得很清楚,不适合新手。自己写一个。 题意:给你点的坐标,然后两点间可以有两种方式来通信:第一种是卫星通信,第二种是无线电通信。 卫星通信:任何两个有卫星频道的点间都可以直接建立连接,与点间的距离无关; 无线电通信:两个点之间的距离不能超过D,无线电收发器的功率越大,D越大,越昂贵。 计算无线电收发器D

uva 10025 The ? 1 ? 2 ? ... ? n = k problem(数学)

题意是    ?  1  ?  2  ?  ...  ?  n = k 式子中给k,? 处可以填 + 也可以填 - ,问最小满足条件的n。 e.g k = 12  - 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12 with n = 7。 先给证明,令 S(n) = 1 + 2 + 3 + 4 + 5 + .... + n 暴搜n,搜出当 S(n) >=

poj 1734 (floyd求最小环并打印路径)

题意: 求图中的一个最小环,并打印路径。 解析: ans 保存最小环长度。 一直wa,最后终于找到原因,inf开太大爆掉了。。。 虽然0x3f3f3f3f用memset好用,但是还是有局限性。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#incl

hdu 1102 uva 10397(最小生成树prim)

hdu 1102: 题意: 给一个邻接矩阵,给一些村庄间已经修的路,问最小生成树。 解析: 把已经修的路的权值改为0,套个prim()。 注意prim 最外层循坏为n-1。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstri

poj 2175 最小费用最大流TLE

题意: 一条街上有n个大楼,坐标为xi,yi,bi个人在里面工作。 然后防空洞的坐标为pj,qj,可以容纳cj个人。 从大楼i中的人到防空洞j去避难所需的时间为 abs(xi - pi) + (yi - qi) + 1。 现在设计了一个避难计划,指定从大楼i到防空洞j避难的人数 eij。 判断如果按照原计划进行,所有人避难所用的时间总和是不是最小的。 若是,输出“OPETIMAL",若