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 <vector>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#include <climits>
#define MOD 2018
#define LL long long
#define ULL unsigned long long
#define Pair pair<int, int>
#define mem(a, b) memset(a, b, sizeof(a))
#define _  ios_base::sync_with_stdio(0),cin.tie(0)
//freopen("1.txt", "r", stdin);
using namespace std;
const int maxn = 100010, INF = 0x7fffffff;
LL vis[maxn];
int ans;
set<ULL> s;

ULL power(ULL a, ULL b) {     //快速幂
    ULL res = 1;
    while(b)
    {
        if(b & 1) res = res * a;
        a = a * a;
        b >>= 1;
    }
    return res;
}
//ULL power(int a, int b)  //二分幂
//{
//    if(b == 0) return 1;
//    ULL res = power(a, b/2);
//    res *= res;
//    if(b & 1) res *= a;
//    return res;
//}

void init()
{
    ans = 0;
    mem(vis, 0);
    for(int i=2; i<=64; i++)
        if(!vis[i])
        {
            for(LL j=(LL)i*i; j<=64; j+=i)
               vis[j] = 1;
        }
}

int main()
{
    init();
    s.insert(1);

    for(ULL i=2; i< (1<<16); i++)
    {
        double t=ceil(64.0/log(i)*log(2))-1;

        for(int j=4; j<=64; j++)
        {
            if(!vis[j])continue;
            if(j> t) break;
            ULL res = power(i, j);
            s.insert(res);
        }
    }
    for(set<ULL>::iterator it=s.begin(); it!=s.end(); it++)
        printf("%llu\n",*it);

    return 0;
}

原文地址:https://www.cnblogs.com/WTSRUVF/p/9319092.html

时间: 2024-11-05 14:19:30

The Super Powers UVA - 11752(合数幂)的相关文章

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就可以了.如果指数非质数,就放到集合中.

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^

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

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 10006 快速幂运算

知识补充: 如果a和b关于m同于,那么(a - b )是m的整数倍. 负数取余运算:不同的语言有不同的方法,其中C和JAVA是按第一个数的符号确定结果的符号,C++则要依据系统而定. 取余运算的发展: 1.(a+b)%p=(a%p+b%p)%p 2.(a?b)%p=(a%p?b%p)%p 3.(a?b)%p=(a%p?b%p)%p 4.(ab)%p=((a%p)b)%p 费马定理:对于一个不能被p整除的数a: ap≡a mod p ap?1≡1 mod p 快速幂算法(求xn%mod): 有两种

数论 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

UVa 11582 (快速幂取模) Colossal Fibonacci Numbers!

题意: 斐波那契数列f(0) = 0, f(1) = 1, f(n+2) = f(n+1) + f(n) (n ≥ 0) 输入a.b.n,求f(ab)%n 分析: 构造一个新数列F(i) = f(i) % n,则所求为F(ab) 如果新数列中相邻两项重复出现的话,则根据递推关系这个数列是循环的. 相邻两项所有可能组合最多就n2中,所以根据抽屉原理得到这个数列一定是循环的. 求出数列的周期,然后快速幂取模即可. 1 #include <cstdio> 2 #include <iostrea