根据题意,首先可以一眼看出一个重要的规律:
对于任意的正整数 \(n\),都有
根据这个规律,我们很容易得知一个性质,当枚举到一个数 \(k\) 时,如果已经枚举过的数 \(i(i<k)\) 没有一个能满足 \(d(i)=k\),那么 \(k\) 是“Self-Number”。这与质数筛的条件十分相似,因此考虑使用类似欧拉筛的思路实现。
实现过程比较简单,具体地,当枚举到一个正整数 \(k\) 时,判断是否满足上述性质,满足则输出,然后求出 \(d(k)\),并将其对应值做标记。
时间复杂度 \(O(n)\),代码实现如下:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int a[1000001];
int main()
{
for(int i=1;i<=1000000;i++)
{
if(a[i]==0) cout<<i<<endl;
int k=i,t=i;
while(k>0)
{
t+=k%10;
k/=10;
}
a[t]=1;
}
return 0;
}
标签:10,UVA640,正整数,int,枚举,include
From: https://www.cnblogs.com/-lilong-/p/17976803