蓝桥杯 01组成的N的倍数(bfs)(cf2)

给定一个自然数 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;
}
发布了7 篇原创文章 · 获赞 0 · 访问量 174

猜你喜欢

转载自blog.csdn.net/weixin_43790882/article/details/104022953