51nod-1109 01组成的N的倍数(宽搜)

本文介绍了一种算法,用于解决给定一个自然数N,如何找到最小的M,使得M是N的倍数且仅由1和0组成的问题。采用宽度优先搜索策略,逐步构建可能的M值。

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

原题链接

基准时间限制:1 秒 空间限制:131072 KB 分值: 40  难度:4级算法题
 收藏
 关注
给定一个自然数N,找出一个M,使得M > 0且M是N的倍数,并且M的10进制表示只包含0或1。求最小的M。
例如:N = 4,M = 100。
Input
输入1个数N。(1 <= N <= 10^6)
Output
输出符合条件的最小的M。
Input示例
4
Output示例
100

用宽度优先搜索,先求出1位数字对n取模的的情况,把1加入队列,接下从队列中取出元素计算它*10 % n 和 (*10 + 1) % n也就是两位数对n取的情况,以此类推,直到对n的取模值为0,然后输出路径.

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <queue>
#define maxn 1000005
using namespace std;
typedef long long ll;

int pre[maxn], p[maxn];
void print(int k){
	
	if(k == -1)
	 return ;
	print(pre[k]);
	printf("%d", p[k]);
}
int main(){
	
	int n, p1, p2;
	
	scanf("%d", &n);
	if(n == 1){
		puts("1");
		return 0;
	}
	queue<int> q;
	q.push(1);
	pre[1] = -1;
	p[1] = 1;
        while(!q.empty()){
    	int d = q.front();
    	q.pop();
    	p1 = d * 10 % n;
    	p2 = (d * 10 + 1) % n;
    	if(p1 == 0){
    		print(d);
    		puts("0");
    		break;
	}
	if(p2 == 0){
		print(d);
		puts("1");
		break;
	 }
    	if(pre[p1] == 0){
    		pre[p1] = d;
    		p[p1] = 0;
    		q.push(p1);
	}
	if(pre[p2] == 0){
		pre[p2] = d;
		p[p2] = 1;
		q.push(p2);
	 }
	}
	return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值