码迷,mamicode.com
首页 > 其他好文 > 详细

500万以内的亲和数

时间:2015-08-30 23:16:55      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:

//时间复杂度为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;
}



 

版权声明:感觉我写的还算不错的的话希望你能够动动你的鼠标和键盘为我点上一个赞或是为我奉献上一个评论,在下感激不尽!_______________________________________________________欢迎转载,希望在你转载的同时,添加原文地址,谢谢配合

500万以内的亲和数

标签:

原文地址:http://blog.csdn.net/u011225629/article/details/48109691

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!