zoukankan      html  css  js  c++  java
  • P1900 自我数

    题意:

    对于每一个正整数n,我们定义d(n)为n加上它每一位数字的和。

    例如,d(75)=75+7+5=87。给定任意正整数n作为一个起点,都能构造出一个无限递增的序列:n, d(n), d(d(n)), d(d(d(n))), . . .

    例如,如果你从33开始,下一个数是33+3+3=39,再下一个为39+3+9=51,再再下一个为51+5+1=57,因此你所产生的序列就像这样:33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141, . . .

    数字n被称作d(n)的发生器。在上面的这个序列中,33是39的发生器,39是51的发生器,51是57的发生器等等。

    有一些数有超过一个发生器,如101的发生器可以使91和100。一个没有发生器的数被称作Self-Number。如前13个Self-Number为1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, 97。

    我们将第i个Self-Number表示为a[i],所以a[1]=1, a[2]=3, a[3]=5. . .

    现在给出n和k

    接下来是k个整数$s_i$

    输出$le n$的自我数的个数

    然后依次输出第$s_i$个自我数

    其实上来我想到了欧拉素数筛

    那这题就简单了,枚举每个数,没有被标记,就储存

    并用其更新其它数

    然而。。。MLE !!

    一看限制

    靠!

    数据加强了!! 内存限制6MB   QAQ

    于是去请教dalao雷哥

    他vis只开了100!

    原来,可以滚动!

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<cctype>
    #include<algorithm>
    using namespace std;
    #define olinr return
    #define _ 0
    #define love_nmr 0
    #define DB double
    inline int read()
    {
        int x=0,f=1;
        char ch=getchar();
        while(!isdigit(ch))
        {
            if(ch=='-')
                f=-f;
            ch=getchar();
        }
        while(isdigit(ch))
        {
            x=(x<<1)+(x<<3)+(ch^48);
            ch=getchar();
        }
        return x*f;
    }
    int a[1000000];
    int tot;
    bool vis[120];
    inline void put(int x)
    {
        if(x<0)
        {
            x=-x;
            putchar('-');
        }
        if(x>9)
            put(x/10);
        putchar(x%10+'0');
    }
    int n;
    int k;
    int s[5050];
    inline int getnxt(int x)
    {
        int tt=x;
        while(x)
        {
            tt+=x%10;
            x/=10;
        }
        return tt;
    }
    int main()
    {
        n=read();
        k=read();
        for(int i=1;i<=k;i++)
            s[i]=read();     //询问
        for(int i=1,j=1;i<=n;i++,j++)   //i循环每一个数,j用来滚动vis
        {
            if(j>99) j-=99;            //滚动
            if(!vis[j]) a[++tot]=i;    //储存(j=i%99)
            int c=getnxt(i)%99;       
            if(!c)
                vis[99]=true;    //取模等于零其实是99
            else
                vis[c]=true;    //标记
            vis[j]=false;        //用完清空,下次继续滚动
        }
        put(tot);
        putchar('
    ');
        for(int i=1;i<=k;i++)
        {
            put(a[s[i]]);
            putchar(' ');
        }
        olinr ~~(0^_^0)+love_nmr;
    }
  • 相关阅读:
    Python Socket详细介绍
    Python 并发编程-进程
    python UDP-数据报协议
    python TCP协议详解 三次握手四次挥手和11种状态
    3.爬虫 urlib库讲解 总结
    2.爬虫 urlib库讲解 异常处理、URL解析、分析Robots协议
    1.爬虫 urlib库讲解 Handler高级用法
    0.爬虫 urlib库讲解 urlopen()与Request()
    如何在指定文件夹下进入jupyter notebook
    Markdown常用的几种语法
  • 原文地址:https://www.cnblogs.com/olinr/p/9580545.html
Copyright © 2011-2022 走看看