UVA640

根据题意,首先可以一眼看出一个重要的规律:
对于任意的正整数 \(n\),都有

\[d(n)>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;
}
posted @ 2024-01-20 17:30  liyilang2021  阅读(3)  评论(0编辑  收藏  举报