The Super Powers UVA - 11752

题目大意:将范围从1~pow(2,64)-1内的super power输出。super power的定义:一个数x至少存在两种x=pow(i,k),(k!=1)。

题解: 注意数据范围2的64次方-1,而long long 的范围是2的63次方-1,所以要用unsigned long long。

一个数x至少存在两种幂形式,说明这个幂可以拆开,即这个幂不是质数。

最小非质数(1除外)是4,所以我们只需要枚举2的16次方-1就可以了。

指数只需要枚举1~64就可以了。如果指数非质数,就放到集合中。

判溢出:INF=2的64-1,如果当前值ans满足ans>INF/i时,下一步一定会溢出,所以直接跳过就可以了。

最后把放入set中

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const int N=65;
const ll INF=(1<<64)-1;
bool prime[N];
set<ll>se;
bool check(int x)
{
    int c=sqrt(x+1);
    for(int i=2;i<=c;i++){
        if(x%i==0) return 0;
    }
    return 1;
}
int main()
{
    for(int i=1;i<=64;i++)
        if(check(i)) prime[i]=1;
     for(int i = 2; i <= 65536; i++){
        ll ans = 1;
        for(int j = 1; j <= 64; j++){
            ans *= i;
            if(!prime[j]) se.insert(ans);
            if(ans > INF / i) break;
        }
    }
    se.insert(1);
    set<ll>::iterator  it;
    for(it=se.begin();it!=se.end();it++){
        cout<<*it<<endl;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/Accepting/p/12547507.html

时间: 2024-10-02 22:12:17

The Super Powers UVA - 11752的相关文章

The Super Powers UVA - 11752(合数幂)

题意: 求1~2^64-1之间所有的 至少是两个不同的正整数的幂的数  升序输出 一个数的合数次幂即为这样的数 找出1~2^64-1中所有数的合数次幂 用set存起来(既能防止重复 又能升序) 最后输出就好了 #include <iostream> #include <cstdio> #include <sstream> #include <cstring> #include <map> #include <set> #include

UVA - 11752 The Super Powers

We all know the Super Powers ofthis world and how they manage to get advantages in political warfare or evenin other sectors. But this is not a political platform and so we will talkabout a different kind of super powers – "The Super Power Numbers&qu

UVA 11752 超级幂

UVA 11752 超级幂 Z - The Super Powers Time Limit:1000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVA 11752 Description 题意:定义一个数为超级幂,当这个数能表示成至少两个不同数字的幂时.如16=2^4,16=4^2.输出1~2^64-1范围内的超级幂. 思路:显然一个数能称为超级幂,这个数肯定是一个数的合数幂,即a^

The Super Powers

The Super Powers Time Limit: 1000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu [Submit]   [Go Back]   [Status] Description A The Super Powers   We all know the Super Powers of this world and how they manage to get advantages in political

uva 11752 The Super Powers(暴力)

题目:https://cn.vjudge.net/problem/UVA-11752 题解:这里只讨论处理越界的问题. 因为题目最上界是 264-1. 我们又是求次幂的. 所以当我们就可以知道 i 的时候的界限 limit = 264-1 / i.如果刚好前一个次幂是 limit,那么再乘一个 i 刚好等于 264-1,按照题意是符合的. 那么如果当前的 次幂 a 是大于 limit 的话,a*i 就一定越界(可以自己想一想为什么),这个时候就可以break了. 这一题用set 保存,因为set

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

题目链接 题意:如果有一个数至少是两个不同的正整数的幂,那么称它为超级幂.按照升序输出1~2^64-1之间的所有超级幂. 思路:n = a ^ i = b ^ j,那么就证明指数要为合数,所以只要找出64以内的所以合数,然后枚举在1 << 16之内的数为底数的值,这里要注意溢出问题,要求出每个底数a的所能得到的最大幂,所以max = (log(2 ^ 64 -1) / log(a)): 代码; #include <iostream> #include <cstdio>

数论 UVA 11752

题目大意是在1~2^64-1的范围内找到所有符合条件的数,条件要求这个数字是两个或两个以上不同数字的幂,例如64=8^2=4^3. 对于这一题,分析是:如果一个满足这个条件的数字一定可以转换成i^k,而且k是一个合数.同时,幂指数的上限在1~64中,这一点是通过观察筛选数字的范围 所得出的.综上,幂指数k的限定条件是(1<=k<=64,k为合数).那么在正式筛选数字前可以通过素数筛选从而来标记出1~64中所有的合数,而对于每一种情况的幂指数就是ceil(log(2^64)/log(i))=ce

kuangbin 带你飞 数学基础

模版整理: 晒素数 void init() { cas = 0; for (int i = 0 ; i < MAXD ; i++) is_prime[i] = true; is_prime[0] = is_prime[1] = false; for (int i = 2 ; i < MAXD ; i++) { if (is_prime[i]) { prime[cas++] = i; for (int j = i + i ; j < MAXD ; j += i) is_prime[j] =

UVa11752

11752 The Super PowersWe all know the Super Powers of this world and how they manage to get advantages in political warfareor even in other sectors. But this is not a political platform and so we will talk about a different kindof super powers — “The