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

UVA11752-The Super Powers(素数表+log)

时间:2014-09-13 10:38:15      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:style   http   color   io   os   ar   for   问题   sp   

题目链接


题意:如果有一个数至少是两个不同的正整数的幂,那么称它为超级幂。按照升序输出1~2^64-1之间的所有超级幂。

思路:n = a ^ i = b ^ j,那么就证明指数要为合数,所以只要找出64以内的所以合数,然后枚举在1 << 16之内的数为底数的值,这里要注意溢出问题,要求出每个底数a的所能得到的最大幂,所以max = (log(2 ^ 64 -1) / log(a));

代码;

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <set>

using namespace std;

typedef unsigned long long ull;

const int MAXN = 100;

int vis[MAXN];

set<ull> arr;
set<ull>::iterator it;

void init() {
    memset(vis, 0, sizeof(vis));    
    for (int i = 2; i < MAXN; i++) {
        if (!vis[i])
        for (int j = i * 2; j < MAXN; j += i)
            vis[j] = 1;;
    }
}

ull pow(int n, int k) {
    if (k == 0) return 1;
    if (k == 1) return n;
    ull a = pow(n, k / 2);
    ull ans = a * a;
    if (k % 2)
        ans = ans * n;
    return ans;
}

int main() {
    init();
    arr.clear();
    arr.insert(1);

    double lmax = log(pow(2.0, 64) - 1);
    for (int i = 2; i < (1 << 16); i++) {
        int l = ceil(lmax / log(i)); 
        for (int j = 4; j < l; j++) {
            if (vis[j]) {
                ull num = pow(i, j); 
                if (!arr.count(num)) 
                    arr.insert(num);
            } 
        }  
    }

    for (it = arr.begin(); it != arr.end(); it++)
        cout << *it << endl;
    return 0;
}


UVA11752-The Super Powers(素数表+log)

标签:style   http   color   io   os   ar   for   问题   sp   

原文地址:http://blog.csdn.net/u011345461/article/details/39249829

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