//时间复杂度为O(N*log(N))
//时间复杂度准确做法:
//n * (1 + 1/2 + 1/3 + 1/4 + ..... + 1/n) ~~ N*InN
//所以第二个for循环的时间复杂度约为O(N*log(N))
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <map> #include <set> #include <list> #include <cassert> #include <string> #include <climits> #include <algorithm> using namespace std; #define MAXN 5000000 #define Left(i)(2*i+1) #define Right(i)(2*i+2) #define _cp(a, b)((a)<(b)) #define min(a, b)((a)<(b)?(a):(b)) #define max(a, b)((a)>(b)?(a):(b)) #define RST(N)memset(N, 0, sizeof(N)) int sum[MAXN+10]; //防止溢出 int main() { freopen("data.out", "w", stdout); for(int i=0; i<=MAXN; i++) sum[i]=1; //1是所有数的真因子,所以全部置1 //预处理,时间复杂度为O(N*log(N)) for(int i=2; i+i<=MAXN; i++) { //500万以下的真因数不超过它的一半 int j = i + i; //因为是真因数,所以不能加上本身 while(j <= MAXN) { sum[j] += i; //将所有i的倍数全部加上i j += i; } } for(int i=220; i<=MAXN; i++) //扫描 { //去重,判断是否越界,判断亲和数 if(sum[i]>i && sum[i]<=MAXN && sum[sum[i]]==i) { printf("%d %d\n", i, sum[i]); } } return 0; }
版权声明:感觉我写的还算不错的的话希望你能够动动你的鼠标和键盘为我点上一个赞或是为我奉献上一个评论,在下感激不尽!_______________________________________________________欢迎转载,希望在你转载的同时,添加原文地址,谢谢配合
时间: 2024-10-21 21:26:38