The Super Powers UVA - 11752(合數冪)
阿新 • • 發佈:2018-07-16
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(合數冪)