zoukankan      html  css  js  c++  java
  • UVA 11752 超级幂

    UVA 11752 超级幂

    Z - The Super Powers
    Time Limit:1000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu

    Description

    Download as PDF
     
    题意:定义一个数为超级幂,当这个数能表示成至少两个不同数字的幂时。如16=2^4,16=4^2。输出1~2^64-1范围内的超级幂。
    思路:显然一个数能称为超级幂,这个数肯定是一个数的合数幂,即a^(b*c)=(a^b)^c=(a^c)^b。而最小合数是4,所以只需从1枚举到2^16即可。现在重点再判溢出,2^64-1显然刚好是ull的范围,直接判x<=0||x>INF显然是会出错的,因为有可能一次溢出非常多又溢回正数了。这里方法是转换为double取对数,double的范围比要多,而且取对数还可以把指数放下来。
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<vector>
    #include<stack>
    #include<queue>
    #include<set>
    #include<map>
    #include<string>
    #include<math.h>
    #include<cctype>
    #define ll long long
    #define REP(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
    #define REPP(i,a,b,t) for(int (i)=(a);(i)<=(b);(i)+=(t))
    #define PII pair<int,int>
    #define MP make_pair
    #define PB push_back
    #define RI(x) scanf("%d",&(x))
    #define RLL(x) scanf("%lld",&(x))
    #define RI64(x) scanf("%I64d",&(x))
    #define DRI(x) int x;scanf("%d",&(x))
    #define DRLL(x) ll x;scanf("%lld",&(x))
    #define DRI64(x) llx;scanf("%I64d",&(x))
    #define MS0(a) memset((a),0,sizeof((a)))
    #define MS1(a) memset((a),0,sizeof((a)))
    #define MS(a,b) memset((a),(b),sizeof((a)))
    
    using namespace std;
    
    typedef unsigned long long ull;
    const int maxn=1000100;
    const ull INF=(1LL<<64)-1;
    const double EPS=0.0000000001;
    const double Pi=acos(-1.0);
    
    bool isprime[maxn];
    vector<int> np;
    set<ull> vis;
    
    ll qpow(ull n,ull k)
    {
        ull res=1;
        while(k){
            if(k&1) res*=n;
            n*=n;
            k>>=1;
        }
        return res;
    }
    
    void getNotPrime()
    {
        MS(isprime,1);
        REP(i,2,maxn-1){
            if(!isprime[i]) continue;
            REPP(j,i*2,maxn-1,i) isprime[j]=0;
        }
        REP(i,2,64){
            if(!isprime[i]) np.PB(i);
        }
    }
    
    int main()
    {
        getNotPrime();
        puts("1");
        REP(i,2,(1<<16)){
            REP(j,0,(int)np.size()-1){
                if(np[j]*log10(i*1.0)>=64*log10(2.0)) break;
                ull x=qpow(i,np[j]);
                //cout<<i<<" "<<np[j]<<endl;getchar();
                if(vis.find(x)==vis.end()){
                    vis.insert(x);
                }
            }
        }
        for(set<ull>::iterator it=vis.begin();it!=vis.end();it++) printf("%llu
    ",*it);
        return 0;
    }
    View Code
    没有AC不了的题,只有不努力的ACMER!
  • 相关阅读:
    匿名内部类
    父类引用指向子类对象【转】
    书签收集
    Linux搭建我的世界服务器
    Python入门学习-DAY27- isinstance与issubclass、反射、内置方法
    Python入门学习-DAY26-绑定方法与非绑定方法
    Python入门学习-DAY25-组合、多态、封装
    Python入门学习-DAY24-继承
    Python入门学习-DAY23-面向对象编程
    Python入门学习-DAY20-常用模块三-re模块、subprocess模块
  • 原文地址:https://www.cnblogs.com/--560/p/4572803.html
Copyright © 2011-2022 走看看