UVA 11752 The Super Powers

/*
求1到2^64-1之间的数,这个数至少有两个不同数的正整数的幂,按从小到大的顺序输出!
要是两个不同正整数的幂,则它必定是一个正整数的合数幂(这样才可以继续分解出另外一个数的幂形式)
*/
#include <algorithm>
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <map>
#include <set>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
const LL MAXN = 1e6;
const ULL INF = (1 << 64) - 1;
bool num[MAXN];
void init()
{
    LL i, j, k = 0;
    
    for(i = 2; i * i  <= 64; i++) {
        if(!num[i]) {
            for(j = i * 2; j <= 64; j += i)
                num[j] = true;
        }
    }
}
int main()
{
    init();
    set<ULL>st;
    st.insert(1);
    int i, j, k = 0;
    /*合数最小是4,对应的底数是2^16*/
    for(i = 2; i <= 1 << 16; i++) {
        ULL sum = 1;
        for(j = 1; j <= 64; j++) {
            sum *= i;
            if(num[j])
                st.insert(sum);
            if(sum > INF / i)
                break;
        }
    }
    set<ULL>::iterator it;
    for(it = st.begin(); it != st.end(); it++)
        cout << *it << endl;
    return 0;
}

 

posted @ 2017-04-24 20:46  byonlym  阅读(101)  评论(0编辑  收藏  举报