• 51nod 1109 bfs


    给定一个自然数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

    对于m每一位上的数要么是0 要么是1,那就可以枚举每一位上的值,又得到的m最小,那么可以bfs解决,但是这题的n比较大,普通的bfs不行,会爆__int64 所以需要优化,
    可以定义一个数组,标记每次出现的余数,因为同于定理,如果当前的余数之前出现过那么久没有必要再对当前的数进行运算。又m最后会很大,所以需要存储当前满足条件的路径和值。

    #include<map>
    #include<queue>
    #include<stack>
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define INF 1000000001
    #define ll __int64
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    using namespace std;
    const int MAXN = 1000010;
    struct node
    {
        int flag;
        int val;
        int fa;
    }a[MAXN];
    int vis[MAXN];
    int cnt;
    int n,ans;
    void bfs()
    {
        queue<int>q;
        cnt = 1;
        a[0].fa = -1;
        a[0].flag = 1;
        a[0].val = 1;
        vis[1] = 1;
        q.push(0);
        while(!q.empty()){
            int t = q.front();
            q.pop();
            if(a[t].val == 0){
                ans = t;
                return;
            }
            a[cnt].flag = 0;
            a[cnt].val = (a[t].val * 10) % n;
            a[cnt].fa = t;
            if(!vis[a[cnt].val]){
                vis[a[cnt].val] = 1;
                q.push(cnt);
                cnt++;
            }
            a[cnt].flag = 1;
            a[cnt].val = (a[t].val * 10 + 1) % n;
            a[cnt].fa = t;
            if(!vis[a[cnt].val]){
                vis[a[cnt].val] = 1;
                q.push(cnt);
                cnt++;
            }
        }
    }
    void find(int p)
    {
        if(p == -1)return;
        find(a[p].fa);
        printf("%d",a[p].flag);
    }
    int main()
    {
        while(cin >>n){
            if(n == 1){
                cout<<1<<endl;
                continue;
            }
            memset(vis,0,sizeof(vis));
            bfs();
            find(ans);
            cout<<endl;
        }
    }
  • 相关阅读:
    【SpringBoot框架学习】yml/yaml语法 详解
    【SpringBoot框架学习】搭建开发环境 详解
    【SpringBoot框架学习】热部署 的配置 详解
    JVM-类加载机制
    JVM-字节码
    JVM-垃圾收集
    JVM-体系结构
    HTTP-报文结构
    TCP-四次挥手
    TCP-三次握手
  • 原文地址:https://www.cnblogs.com/sweat123/p/5371672.html
Copyright © 2020-2023  润新知