基准时间限制: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;
}