https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1109
基准时间限制: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 搜索+同余定理剪枝、
每次入队 (队首*10+0/1)%n 的点,若x%n!=0,则abcdx%n!=0,
所以记录每次的余数,已经出现过的就不能出解不用入队了
#include <cstdio>
#include <queue> const int N(1e6+);
int pre[N],ans[N],n;
std::queue<int>que; void cout(int x)
{
if(x==-) return ;
cout(pre[x]);
printf("%d",ans[x]);
} int Presist()
{
scanf("%d",&n);
pre[]=-; ans[]=; que.push();
for(int u,v; !que.empty(); )
{
u=que.front();
que.pop();
v=(u*)%n;
if(v==)
{
cout(u);
puts("");
break;
}
if(!pre[v])
{
pre[v]=u;
ans[v]=;
que.push(v);
}
v=(u*+)%n;
if(v==)
{
cout(u);
puts("");
break;
}
if(!pre[v])
{
pre[v]=u;
ans[v]=;
que.push(v);
}
}
return ;
} int Aptal=Presist();
int main(){;}