题目大意:将范围从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