给定一个自然数 N,找出一个 M,使得 M>0 且 M 是 N 的倍数,并且 M 的 10 进制表示只包含 0 或 1,求最小的 M。
Input
输入 1 个数 N。(1≤N≤1e6)
Output
输出符合条件的最小的 M。
input
1
output
1
input
4
output
100
思路:
求最小的倍数,相当于从1开始搜,最快搜到的数,用广搜。
由题意可得所求的数可能会很大,用longlong存远远不够,需要用string进行存储。
但是用string存的数除n又有点麻烦,于是用一个int型的num来存储当前数除n的余数。如果当前的num等于0,则说明当前的数是n的倍数。
关于剪枝,开一个1e6的数组,就可以标记n的每一个余数是否出现过。同余的数肯定要么都除得开n,要么都除不开。同余的数如果出现过了,就没必要把它入队了。
详情见代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<string>
#include<cmath>
#include<cstring>
#include<queue>
#include<set>
#define inf 0x3f3f3f3f
using namespace std;
struct node
{
string s;
int num;
};
int book[1000000];
int main()
{
int n,i;
cin>>n;
if(n==1)
cout<<"1"<<endl;
else
{
queue<node> q;
node e,c;
e.s='1',e.num=1;
q.push(e);
book[1]=1;
while(!q.empty())
{
c=q.front();
q.pop();
if(c.num==0)
break;
for(i=0;i<=1;i++)
{
e.num=(c.num*10+i)%n;
if(book[e.num]==0)
{
book[e.num]=1;
e.s=c.s;
e.s.push_back(i+'0');
q.push(e);
}
}
}
cout<<c.s<<endl;
}
return 0;
}