codeforce1070A. Find a Number (bfs+记忆化+10进制按位取余)

本文介绍了一种使用广度优先搜索(BFS)解决特定数学问题的方法:寻找最小正整数,该数能被给定的d整除,且其数字之和等于s。通过详细的代码解释,展示了如何利用10进制按位取余的思想,从0开始进行BFS搜索并记录路径,最终找到满足条件的最小正整数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

给出两个正整数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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值