zoukankan      html  css  js  c++  java
  • 51 nod 1109 01组成的N的倍数

    基准时间限制: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

    若没有是n的倍数的条件,如何构造01序列?
    开一个队列,先把1放进去
    然后取出1,把1*10,1*10+1放进去,以此类推
    是n的倍数只需要判断一下即可
    但答案可能爆long logn
    所以用同余定理 若a%b=c,那么ax%b=cx%b (x!=0)
    用字符数组记录01序列,同时记录这个01序列%n的余数
    还有一个问题,空间消耗巨大
    还是用同余定理
    如果a%n=c,b%n=c,a<b
    那么这个时候b就不用入队了
    因为答案只看余数
    #include<cstdio>
    #include<queue>
    #include<cstring>
    #include<iostream>
    using namespace std;
    struct node
    {
        string s;
        int mod;
    }cur,nxt;
    bool v[1000001];
    queue<node>q;
    int main()
    {
        int n;
        scanf("%d",&n);
        cur.s="1";cur.mod=1;
        q.push(cur);
        while(!q.empty())
        {
            cur=q.front();
            q.pop();
            nxt.mod=(cur.mod*10)%n;
            nxt.s=cur.s+'0';
            if(nxt.mod==0)
            {
                cout<<nxt.s;
                return 0;
            }
            if(!v[nxt.mod])
            {
                q.push(nxt);
                v[nxt.mod]=true;
            }
            nxt.mod=(cur.mod*10+1)%n;
            nxt.s=cur.s+'1';
            if(nxt.mod==0)
            {
                cout<<nxt.s;
                return 0;
            }
            if(!v[nxt.mod])
            {
                q.push(nxt);
                v[nxt.mod]=true;
            }
        }
    }
  • 相关阅读:
    gzip是一种数据格式,deflate是一种压缩算法
    js 实现图片上传 续
    iframe 元素会创建包含另外一个文档的内联框架(即行内框架)
    HTTPS简介----
    回归测试
    HTTP 返回码 400
    js 实现 一张图片的上传
    121. Best Time to Buy and Sell Stock
    119. Pascal's Triangle II
    118. Pascal's Triangle
  • 原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/6719720.html
Copyright © 2011-2022 走看看