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;
}
原文地址:https://www.cnblogs.com/olinr/p/9580545.html