1. 程式人生 > >The Super Powers UVA - 11752(合數冪)

The Super Powers UVA - 11752(合數冪)

freopen str size 一個 bre urn fin iter ont

題意:

求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; }

The Super Powers UVA - 11752(合數冪)