01组成的N的倍数
李陶冶 (命题人)
基准时间限制:1 秒 空间限制:131072 KB 分值: 40
给定一个自然数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
思路:最小什么的,广搜。定义一个结构体,结构体里两个变量,一个是01字符串,存储答案;另一个为%n的余数。vis[i]=1代表%n=1的余数的出现过,不入队列。n=1时特判一下。
#include<stdio.h>
#include<iostream>
#include<queue>
#include<string.h>
#include<algorithm>
using namespace std;
#define ll long long
ll n;
struct node{
string str;
ll num;
};
int vis[1000006];
void bfs() {
node s,t;
queue<node>q;
s.str="10";
s.num=10%n;
vis[s.num]=1;
t.str="11";
t.num=11%n;
vis[t.num]=1;
q.push(s);
q.push(t);
while(!q.empty()) {
t=q.front();
q.pop();
if(t.num==0) {//是倍数
cout<<t.str<<endl;
return;
}
s.str=t.str+'0';
s.num=t.num*10%n;
if(vis[s.num]==0) {//已经出现过该余数,以前不是答案,接下来也不是
vis[s.num]=1;
q.push(s);
}
s.str=t.str+'1';
s.num=(t.num*10+1)%n;
if(vis[s.num]==0) {
vis[s.num]=1;
q.push(s);
}
}
}
int main()
{
scanf("%lld",&n);
if(n==1)
printf("1\n");
else bfs();
return 0;
}