(UVA

来源:互联网 发布:万德数据库账号 编辑:程序博客网 时间:2024/05/19 10:14

链接: https://vjudge.net/problem/UVA-11752
题意:如果一个数至少是两个不同的正整数的幂,那么称它是超级幂。
比如64=8^2=4^3。 无输入,输出1-2^64-1之间的所有超级幂,按照升序输出

分析:可以想到指数肯定是合数。
而要求按照升序输出所有的超级幂,最大为2^64-1,可以求出指数最大为ceil(64*log(2)/log(i))-1
直接遍历底数,根据题意,会出现重复,需要判重,加入set即可,也可以用数组,调用unique()函数

注意:使用unsigned long long

#include <bits/stdc++.h>using namespace std;#define mem(a,n) memset(a,n,sizeof(a))#define pb(x) push_back(x)typedef long long LL;typedef unsigned long long ull;const int mod=1e6;const double eps=1e-6;const int INF=0x3f3f3f3f;const int N=100;bool pri[N]={0};void init(){    for(int i=2; i<=80; i++)    {        bool flag=0;        for(int j=2; j*j<=i; j++)            if(i%j==0)            {                pri[i]=0;                flag=1;                break;            }        if(!flag) pri[i]=1;    }}void solve(){    set<ull>st;    //printf("6333\n");    for(ull i=2; i<65536; i++)    {        ull tmp=i;        for(ull j=2; j<=ceil(64*log(2)/log(i))-1; j++)        {            tmp*=i;            if(pri[j]) continue;            st.insert(tmp);        }    }    //printf("11333\n");    st.insert(1);    set<ull>::iterator it;    for(it=st.begin(); it!=st.end(); it++)        cout<<(*it)<<endl;}int main(){    //ios::sync_with_stdio(false);    init();    solve();    return 0;}
原创粉丝点击